Performance 在Matlab中将矩阵附加到另一个矩阵上
我有一个矩阵M=[4321;1234]。我想在每次迭代中附加不同大小的矩阵: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=[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
是一个黑盒函数。这是工作的本质,“不能改变”工作的实施方式。这确实是一个耗时的函数,但至少我可以通过做正确的事情来节省一些时间。