更快地重复连接向量的方法

时间:2017-09-28 09:56:53

标签: matlab performance matrix vector concatenation

是否有更快的方法来连接矩阵,如下面的代码?这些代码行将被调用数千次,因此非常耗时。对于1658880个电话,我只需一个片就可以获得15秒! (我有大约2000片,所以通话总数将是1658880 * 2000倍!)

a=rand(1,100);
b=rand(1,100);
c=rand(1,100);
d=rand(1,100);

k=([b; b; b; d; ones(100); c; a; a; a]);

修改

Dev-iL的建议(repmat):

k=zeros(9,100);
k(1:3,:)=repmat(b,3,1);
k(4,:)=d;
k(5,:)=ones(size(a));
k(6,:)=d;
k(7:9,:)=repmat(a,3,1);

没有repmat

k=zeros(9,100);
k(1,:)=b;
k(2,:)=b;
k(3,:)=b;
k(4,:)=d;
k(5,:)=ones(size(a));
k(6,:)=d;
k(7,:)=a;
k(8,:)=a;
k(9,:)=a;

使用repmat,它比原始代码慢11秒。如果没有repmat,我实际上会快15秒!

我感谢您提出更多建议和帮助!提前谢谢!

1 个答案:

答案 0 :(得分:2)

由于在MATLAB中数据以column-major顺序存储,因此最好将a,b,c,d生成为列向量并将它们连接为:

a=rand(100,1);
b=rand(100,1);
c=rand(100,1);
d=rand(100,1);
one = ones(100);
k= [b b b d one c a a a];

相反,您可以预先分配k并将其填写为:

k = ones(100,108); %preallocation
%in the loop you can fill it:
k(:,1)=b;
k(:,2)=b;
k(:,3)=b;
k(:,4)=d;
k(:,105)=c;
k(:,106)=a;
k(:,107)=a;
k(:,108)=a;