我想沿着第三维连接
z = cat(3,A,B,C);
很多次。如果我沿着第二维度这样做那么
z = [A,B,C];
会比
更快z = cat(2,A,B,C);
可以在第三维度上做类似的事情,还是有其他方法可以加快速度?
答案 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