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

时间:2015-05-17 06:24:04

标签: arrays matlab matrix vectorization cell-array

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

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

它给出错误“坏单元引用操作”。 如果我想让第2行再次空置怎么办? 在此先感谢您的任何帮助

2 个答案:

答案 0 :(得分:1)

您要执行的操作需要在函数内进行分配。实现此目的的唯一方法是使用eval,这被视为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)

答案 1 :(得分:1)

您需要找到一个转换,将给定矩阵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循环更具可读性。

相关问题