在不使用 for 循环的情况下将元胞数组中的特定矩阵行设置为零

Set specific rows of matrices in cell array to zero without using a for-loop

我想在不使用 for 的情况下将单元格中特定数量的元素替换为零。例如,要替换下面示例单元格 a 中第 2 行的元素:我应该如何继续使用 cellfun?

a=cell(2,3);
cellfun(@(x)(zeros(a{x}(2,:))),a);

它给出了错误"Bad cell reference operation"。 如果我想再次让第 2 行为空怎么办? 在此先感谢您的帮助

您要执行的操作需要函数内的赋值。实现这一目标的唯一方法是使用 eval, which is considered bad practice.

因此,如果您想将所有内容都保存在一个脚本中,那么循环是最好的选择:

A = {randn(2,3),randn(2,3)};
for ii = 1:numel(A)
    A{ii}(2,:) = 0;
end

如果你不想使用多个文件,你可以把赋值放在一个函数中:

function [ out ] = setZero( cellarray, rowidx )

out = cellarray;
out(rowidx,:) = 0;

end

并按如下方式使用它:

A = cellfun(@(x) setZero(x,2),A ,'uni',0)

您需要找到将给定矩阵 A 转换为第二行全为零的矩阵的转换。这里有三个选择

A=cellfun(@(x) [x(1,:); zeros(size(x(2,:))); x(3:end,:)], A, 'uni', 0)

A=cellfun(@(x) diag(1:size(x,1)~=2)*x, A, 'uni', 0)

A=cellfun(@(x) bsxfun(@times, (1:size(x,1))' ~= 2, x), A, 'uni', 0)

第一个是最稳健的,因为它可以处理您的矩阵具有 NaN 个元素的情况。第二个和第三个备选方案只是将第二行乘以零。第二个通过将它与对角矩阵相乘来实现这一点,其中所有对角元素都是 1 除了元素 (2,2) 为零。第三种选择使用 bsxfun.

实现此目的

这是为了证明您可以在没有 for 循环的情况下实现这一点,但是简单的 for 循环更具可读性。