Performance 在Matlab中将矩阵附加到另一个矩阵上

Performance 在Matlab中将矩阵附加到另一个矩阵上,performance,matlab,matrix,Performance,Matlab,Matrix,我有一个矩阵M=[4321;1234]。我想在每次迭代中附加不同大小的矩阵: 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_ne

我有一个矩阵M=[4321;1234]。我想在每次迭代中附加不同大小的矩阵:

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

正如建议的那样,预分配提供了最大的提升。 使用单元阵列是另一种很好的方法,可以这样实现:

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次迭代的示例,这仍然只有大约1秒…

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