MATLAB:复制向量'n'次

Cap*_*rog 19 matlab vector

我有一个矢量,例如

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)

这看起来有点麻烦.更有效的方法?

Hig*_*ark 39

尝试

repmat([1 2 3],1,3)
Run Code Online (Sandbox Code Playgroud)

我会让你检查文档repmat.


Abh*_*nav 19

这是一个更快的方法比repmatreshape由一个数量级

做这些事情的最佳方法之一是使用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)

该方法具有对显著节省时间reshaperepmat为大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)

两种方法的时间(以秒为单位)如下;

  • 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,两种方法之间的时差会更加显着.我知道,这些时间对于不同的机器可能会有所不同,但是时间数量级的相对差异将会存在.此外,我知道,平均时间可能是一个更好的指标,但我只是想显示两种方法之间的时间消耗的数量级差异.我的机器/操作系统详情如下:

相关机器/ OS/Matlab详细信息:Athlon i686 Arch,Ubuntu 11.04 32 bit,3gb ram,Matlab 2011b

  • 优秀的答案:关于程序性能的陈述支持证据.我在SO上看到很多关于程序性能的断言,很少有证据支持.我不能经常看到自己使用Tony's Trick,但后来我不再使用repmat了,现在我知道如果我发现repmat太慢了会在哪里看. (5认同)
  • 好吧,我会被诅咒.干得好.:) (2认同)