在不使用 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 循环更具可读性。
我想在不使用 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 循环更具可读性。