我有一个矢量,例如
vector = [1 2 3]
Run Code Online (Sandbox Code Playgroud)
我想在自己内部复制n次,即如果n = 3,它最终会:
vector = [1 2 3 1 2 3 1 2 3]
Run Code Online (Sandbox Code Playgroud)
如何为n的任何值实现此目的?我知道我可以做以下事情:
newvector = vector;
for i = 1 : n-1
newvector = [newvector vector];
end
Run Code Online (Sandbox Code Playgroud)
这看起来有点麻烦.更有效的方法?
Abh*_*nav 19
这是一个更快的方法比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(:)';
Run Code Online (Sandbox Code Playgroud)
该方法具有对显著节省时间reshape
或repmat
为大N
的.
编辑:回复@ Li-aung Yip的疑虑
我进行了一次小型Matlab测试来检查repmat
和之间的速度差tony's trick
.使用下面提到的代码,我计算了从基矢量构造相同平铺矢量的时间A=[1:N]
.结果显示,YES,Tony's-Trick更快速地受到了一定程度的震级,特别是对于较大的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
Run Code Online (Sandbox Code Playgroud)
两种方法的时间(以秒为单位)如下;
我的RAM不允许我超过N = 10000.我相信,对于N = 100000,两种方法之间的时差会更加显着.我知道,这些时间对于不同的机器可能会有所不同,但是时间数量级的相对差异将会存在.此外,我知道,平均时间可能是一个更好的指标,但我只是想显示两种方法之间的时间消耗的数量级差异.我的机器/操作系统详情如下:
相关机器/ OS/Matlab详细信息:Athlon i686 Arch,Ubuntu 11.04 32 bit,3gb ram,Matlab 2011b