Условная замена элементов с помощью 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