【问题标题】:Append matrix to another matrix in Matlab将矩阵附加到 Matlab 中的另一个矩阵
【发布时间】:2015-03-20 12:45:16
【问题描述】:

我有一个矩阵 M=[4 3 2 1;1 2 3 4]。我想在每次迭代时附加不同的大小矩阵:

M=[4 3 2 1;1 2 3 4];
for i=1:t
newM=createNewMatrix;
 M=[M;newM];
end

newM 可以是 [] 或 Nx4 矩阵。这虽然很慢。最快的方法是什么?

更新

预分配会是这样的吗?

M=zeros(200000,4)
start=1
M(1:2,:)=M=[4 3 2 1;1 2 3 4];
for i=1:t
newM=createNewMatrix;
size_of_newM=size(newM,1);
finish=start+size_of_newM-1;
M(start:finish,:)=newM;
start=finish;
end

【问题讨论】:

  • 最快的方法是预先分配最终的矩阵。由于它们在内存中的实现方式,元胞数组可能比连接数值矩阵更快(也取决于您的 MATLAB 版本)。见this Undocumented MATLAB article
  • 我更新了问题以验证您的建议
  • createNewMatrix 是做什么的?也许这很慢。您是否尝试过制作随机矩阵并查看速度如何?而且,预分配是明确的第一步
  • 您是否需要在每次迭代时访问扩展的M?也许将个人createNewMatrix 放入预先分配的单元格数组中,然后最后只调用一次cell2mat 就足够了(而且速度很快)?
  • @Dan 假设createNewMatrix 是一个黑盒函数。这是工作的本质,“不能改变”它的实施方式。这确实是一个耗时的功能,但至少我可以通过做正确的事情来节省一些时间。

标签: performance matlab matrix


【解决方案1】:

就像建议的那样,预分配能带来最大的提升。 使用元胞数组是另一种好方法,可以这样实现:

M = cell(200000, 1);
M{1} = [4 3 2 1; 1 2 3 4];
for t=2:200000 
    i = randi(3)-1;
    M{t}=rand(i,4); 
end
MC = vertcat(M{:});

原则上,您会在每个单元格中生成一个包含任意长数组的单元格数组,然后将它们连接起来。 这对我来说几乎是您的预分配更新的两倍。另一方面,对于具有 200k 次迭代的示例,这仍然只有大约一秒...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 2012-12-11
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多