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
是否可以使用双循环来创建整个矩阵?
由于
答案 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来存储它。
两种可能的方法:
使用 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
表示结果不是标量,因此创建了一个单元格数组来存储它们。
使用 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
我知道这一切可能超出了Matlab初学者的知识,但这就是答案的要点: - )