虽然迟到了,但我发布此内容是因为事实证明这是对类似问题 here 的最受欢迎的答案。
这是一种比 repmat 或 reshape 快一个数量级的方法
执行此类操作的最佳方法之一是使用Tony's Trick. 我在哥伦比亚大学的电气工程课程讲义之一中遇到了这个技巧。通常发现 Repmat 和 Reshape 比 Tony 的技巧慢,因为它直接使用 Matlabs 固有索引。为了回答你的问题,
比方说,您想将行向量 r=[1 2 3] N 像 r=[1 2 3 1 2 3 1 2 3...] 一样平铺,然后,
c=r'
cc=c(:,ones(N,1));
r_tiled = cc(:)';
与reshape 或repmat 相比,对于大型N,此方法可显着节省时间。
我进行了一个小的 Matlab 测试来检查 repmat 和 tony's trick 之间的速度差异。使用下面提到的代码,我计算了从基向量A=[1:N] 构造相同平铺向量的时间。结果表明,是的,Tony's-Trick 比 MAGNITUDE 更快,尤其是对于较大的 N。欢迎人们自己尝试。如果必须在循环中执行这样的操作,那么这么大的时间差可能很关键。这是我使用的小脚本;
N= 10 ;% ASLO Try for values N= 10, 100, 1000, 10000
% time for tony_trick
tic;
A=(1:N)';
B=A(:,ones(N,1));
C=B(:)';
t_tony=toc;
clearvars -except t_tony N
% time for repmat
tic;
A=(1:N);
B=repmat(A,1,N);
t_repmat=toc;
clearvars -except t_tony t_repmat N
两种方法的时间(以秒为单位)如下所示;
- N=10,time_repmat = 8e-5,time_tony = 3e-5
- N=100,time_repmat = 2.9e-4,time_tony = 6e-5
- N=1000,time_repmat = 0.0302,time_tony = 0.0058
- N=10000,time_repmat = 2.9199,time_tony = 0.5292
我的 RAM 不允许我超过 N=10000。我敢肯定,对于 N=100000,这两种方法之间的时间差异会更加显着。我知道,对于不同的机器,这些时间可能会有所不同,但是时间数量级的相对差异会保持不变。另外,我知道,平均时间可能是一个更好的指标,但我只是想显示两种方法之间时间消耗的数量级差异。我的机器/操作系统详细信息如下:
相关机器/操作系统/Matlab 详细信息:Athlon i686 Arch、Ubuntu 11.04 32 位、3gb ram、Matlab 2011b