【问题标题】:Conditional element replacement using cellfun使用 cellfun 进行条件元素替换
【发布时间】:2018-10-27 20:34:37
【问题描述】:
vec = randi(10,10,1)
vec(vec < 5) = 0

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

我应该如何将第二行代码转换为可以与cellfun 结合使用的函数句柄?

【问题讨论】:

  • 不同的向量有不同的大小吗?如果大小相同(即它们只是为了方便而存储为一个单元格),并假设它们的总大小在内存方面不太大 - 单元格数组可以转换为数字矩阵,执行替换,然后将数值矩阵转换回元胞数组。

标签: matlab anonymous-function cell-array function-handle elementwise-operations


【解决方案1】:

您可以使用乘法,因为如果满足您的条件,则您有 10 否则。

因此,乘以条件的倒数会得到不变的值(如果不满足条件)或您想要的 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

【讨论】:

  • @Dev-iL 我将条件保留为~(x&lt;5) 而不是x&gt;=5,以表明您需要否定您正在使用的whatever condition,假设x&lt;5是问题的简化!将~ 放在前面意味着您不必为更复杂的语句考虑逻辑否定。当然在这种情况下两者是等价的......
  • 这似乎是一个合适的解决方案。一个问题:我说等号 (=) 在匿名函数中不起作用是否正确?
  • @Andi 请看我上面关于使用~的评论,它是条件的逻辑否定(“非”),即~true==false。您不能在匿名函数中使用 = 是正确的。解决此问题的唯一方法是设置句柄对象的属性时,您可以使用set 命令而不是= 语句,但这不适用于本示例中的矩阵。
【解决方案2】:

不使用匿名函数,而是使用函数句柄怎么样?

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

【讨论】:

  • 是的,函数句柄正在工作。然而,在我看来,这个单行代码需要一个匿名函数。
猜你喜欢
  • 2014-07-26
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2019-01-17
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多