Matlab Double For Loop

时间:2014-10-29 02:25:21

标签: matlab

Matlab初学者。我们说我有一个矩阵

A = [ 2,3,4;
      6,9,1;
      7,8,3;
      2,2,2 ]

我想将每列操作到一个新列(可能大小不同),然后我想拥有全新的矩阵。举个例子,假设我想要除去每个小于4的数字,并将每个其他数字提高到第四个幂。这比我实际尝试做的要简单得多,所以不要过多地阅读这些细节。

如果我是针对特定的专栏做的,请说第一个,我会做

newcolumn=[];
for r=1:4
    if A(r,1)<4
        newcolumn=newcolumn
    else
        newcolumn=vertcat(newcolumn,(A(r,1))^4))
    end
end

是否可以使用双循环来创建整个矩阵?

由于

2 个答案:

答案 0 :(得分:1)

因此,如果您希望列不再具有相同的大小,那么您将不得不使用单元数组或使用一些defualt值填充数值矩阵,可能是NaN。此外,您不需要双循环,因为上面的循环是不必要的:

newcolumn=[];
for r=1:4
    if A(r,1)<4
        newcolumn=newcolumn
    else
        newcolumn=vertcat(newcolumn,(A(r,1))^4))
    end
end

相当于

newcolumn = A(A(:,1) < 4, 1).^4;

所以现在你只需沿着列循环:

jaggedArray{1,size(A,2)} = []; %// Pre-allocate your array (NB for efficiency in Matlab!)
for col = 1:size(A,2)
    jaggedArray{col} = A(A(:,col) < 4, col).^4;
end

答案 1 :(得分:0)

如果结果每行的元素数量不同,您可以使用cell array来存储它。

两种可能的方法:

  1. 使用 arrayfun (相当于for循环):

    B = arrayfun(@(n) A(n,A(n,:)>=4).^4, 1:size(A,1), 'uniformoutput', false);
    

    这会将n中的每个数字1提升到行数size(A,1),并将anonymous function @(n) A(n,A(n,:)>=4).^4应用于它,想。然后将结果放入B{n}。选项'uniformoutput', false表示结果不是标量,因此创建了一个单元格数组来存储它们。

  2. 使用 cellfun :如果要应用于每一行的函数很复杂,而不是使用匿名函数,则可以在文件中正常定义它,例如{ {1}}。在这种情况下,如果您的函数接受一行(而不是数字foo.m)作为输入,则会更容易:

    n

    然后将%// File foo.m function y = foo(x) %// x is a row, y is a row of possibly different size y = x(x>=4).^4; 拆分为其行的单元格数组

    A

    然后使用function handle为您的函数调用Acell = mat2cell(A, ones(1,size(A,1)), size(A,2));

    cellfun
  3. 我知道这一切可能超出了Matlab初学者的知识,但这就是答案的要点: - )