匿名函数中的 If-then-else

问题描述 投票:0回答:2

我试图在匿名函数中使用某种 if-then-else 语句,该函数本身就是

cellfun
的一部分。我有一个包含多个双矩阵的元胞数组。我想用+1替换所有双矩阵中的所有正数,用-1替换所有负数。我想知道是否可以使用匿名函数,而不是编写一个单独的函数,然后从
cellfun
中调用?

这是玩具示例:

mat = [2, 2, 0, -2; -2, 0, 0, 2; -2, 2, -2, 2]
cellarray = repmat({mat}, 3, 1)

我正在寻找这样的东西:

new_cellarray = cellfun(@(x) if x > 0 then x = 1 elseif x < 0 then x = -1, cellarray, 'UniformOutput', false)

我也尝试过这个,但是,显然我不允许在匿名函数中添加等号。

new_cellarray = cellfun(@(x) x(x > 0) = 1, cellarray, 'UniformOutput', false)
new_cellarray = cellfun(@(x) x(x < 0) = -1, cellarray, 'UniformOutput', false)
matlab anonymous-function cell-array
2个回答
6
投票

您可以使用内置函数

sign
,它根据输入返回 1、0 或 -1:

mat = [2, 2, 0, -2; -2, 0, 0, 2; -2, 2, -2, 2];
cellarray = repmat({mat}, 3, 1);
new_cellarray = cellfun(@sign, cellarray, 'UniformOutput', false);

0
投票

如果不需要短路,可以使用布尔运算符(或符号)将每个替代项乘以 0 或 1 倍。 (x>0)*1+(~x)0+(x<0)-1

)

Octave 有 ifelse / merge 命令,这正是你想要的。 合并(x>0,1,合并(x<0,-1,0))

© www.soinside.com 2019 - 2024. All rights reserved.