Условная замена элементов с помощью cellfun

vec = randi(10,10,1)
vec(vec < 5) = 0

func = @(x) x(x < 5) = 0    % This isn't valid

Как мне перевести вторую строку кода в дескриптор функции, который я могу использовать в сочетании с cellfun?

2 ответа

Решение

Вы можете использовать умножение, так как если ваше условие выполнено, у вас есть 1 а также 0 иначе.

Следовательно, умножение на обратное условие дает вам либо неизменное значение (если условие не выполняется), либо желаемую замену 0!

func = @(x) x .* (~(x < 5)) % Replace values less than 5 with 0

Если бы у вас была другая замена, вы могли бы расширить ту же логику

func = @(x) x .* (~(x < 5)) + 10 * (x < 5) % replace values less than 5 with 10

Как насчет не использования анонимной функции, а дескриптора функции вместо этого?

vec = randi(10,10,1);
vec_cell = num2cell(vec);
vec_cell_out = cellfun(@func, vec_cell);

function x = func(x)
    x(x<5) = 0;
end
Другие вопросы по тегам