有没有一种方法可以通过使向量重复自身来扩展它?
>v = [1 2];
>v10 = v x 5; %x represents some function. Something like "1 2" x 5 in perl
那么v10将是:
>v10
1 2 1 2 1 2 1 2 1 2
这应该适用于一般情况,而不仅仅是对于[1 2]。
repmat()
。v10 = repmat(v, 1, 5)
v10=v(repmat(1:length(v),1,5))
这是比repmat
或reshape
快一级的更快的方法
做这种事情的最佳方法之一是使用Tony's Trick.。我在哥伦比亚大学电气工程课程讲义中遇到了这个技巧。相对于使用Repmat和Reshape,Tony's Trick通常会更快,因为它直接使用Matlab的固有索引。回答你的问题,
假设你想将行向量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(:)';
这种方法在处理大量 N
时,相对于使用 reshape
或 repmat
可以显著节省时间。
我进行了一个小的 Matlab 测试,以检查 repmat
和 tony's trick
之间的速度差异。使用下面提到的代码,我计算了从基础向量 A=[1:N]
构建相同平铺向量的时间。结果表明,是的,Tony's-Trick 比起 repmat
快一个数量级,特别是对于更大的 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
以下是两种方法的时间(以秒为单位):
我的RAM不允许我超过N=10000。我相信,对于N=100000,这两种方法之间的时间差异将更加显著。我知道,这些时间可能因不同的机器而异,但时间消耗的数量级相对差异将保持不变。此外,我知道,平均时间可能是一个更好的指标,但我只想展示两种方法在时间消耗方面的数量级差异。我的机器/操作系统/ Matlab详细信息如下:
相关机器/操作系统/Matlab详细信息:Athlon i686 Arch,Ubuntu 11.04 32位,3GB RAM,Matlab 2011b
v=[1 2]
和v100=kron(ones(1,100),v)
是向量v100=[v v ... v]
(重复100次)。如果你想将某些列向量y
与自身连接K
次,则使用yK=kron(ones(K,1),y)
。 - Pantelis Sopasakis