有没有办法加速MATLAB中的连接?

时间:2015-11-17 15:58:26

标签: matlab optimization matrix concatenation

我想沿着第三维连接

z = cat(3,A,B,C);

很多次。如果我沿着第二维度这样做那么

z = [A,B,C];

会比

更快
z = cat(2,A,B,C);

可以在第三维度上做类似的事情,还是有其他方法可以加快速度?

1 个答案:

答案 0 :(得分:0)

有一些索引选项可以获得比cat(3,...)略好的性能。

两个解决方案都使用U(30,30,3)=0;而不是zeros(30,30,3)进行预分配,但是它是unaveave,因为当U已经是更大尺寸的变量时,它将导致下标维度不匹配。

第一个选项是单独分配不同的切片。

%fast but unsafe preallocation
U(30,30,3)=0;
%robust alternative:
%U=zeros(30,30,3)
U(:,:,3)=C;
U(:,:,1)=A;
U(:,:,2)=B;

第二种选择是使用线性索引。对于z1 = cat(3,A,B,C);z2=[A;B;C]z1(:)==z2(:)

是正确的
%fast but unsafe preallocation
U(30,30,3)=0;
%robust alternative:
%U=zeros(30,30,3)
U(:)=[A,B,C];

我对解决方案进行了基准测试,并将其与cat(3,A,B,C)[A,B,C]进行了比较。线性索引解决方案仅略慢于[A,B,C]

0.392289 s for 2D CAT
0.476525 s for Assign slices
0.588346 s for cat(3...)
0.392703 s for linear indexing

基准测试代码:

N=30;
A=randn(N,N);
B=randn(N,N);
C=randn(N,N);
T=containers.Map;
cycles=10^5;
tic;
for i=1:cycles
    W=[A;B;C];
    X=W+1;
end
T('2D CAT')=toc;
tic;
for i=1:cycles
    W=cat(3,A,B,C);
    X=W+1;
end
T('cat(3...)')=toc;
U=zeros(N,N,3);
tic;
for i=1:cycles
    U(N,N,3)=0;
    U(:,:,3)=C;
    U(:,:,1)=A;
    U(:,:,2)=B;
    V=U+1;
end
T('Assign slices')=toc;
tic;
for i=1:cycles
    U(N,N,3)=0;
    U(:)=[A,B,C];
    V=U+1;
end
T('linear indexing')=toc;


for X=T.keys
    fprintf('%f s for %s\n',T(X{1}),X{1})
end