有没有办法通过使其重复来扩展向量?
>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)
如果您知道要在哪个方向扩展向量,显然 repmat 是要走的路。
但是,如果您想要一个始终在最长方向上重复向量的通用解决方案,那么 repmat 和索引的这种组合应该可以解决问题:
v10=v(repmat(1:length(v),1,5))
这是一种比repmat
或reshape
一个数量级更快的方法
做这些事情的最好方法之一是使用托尼的技巧。我在哥伦比亚大学的电气工程课程讲义之一中遇到了这个技巧。通常发现 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(:)';
对于大型's reshape
,此方法可显着节省时间。repmat
N
repmat
我进行了一个小的 Matlab 测试来检查和之间的速度差异tony's trick
。使用下面提到的代码,我计算了从基向量构造相同平铺向量的时间A=[1:N]
。结果表明,是的,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
下面给出了两种方法的时间(以秒为单位);
我的 RAM 不允许我超过 N=10000。我敢肯定,对于 N=100000,这两种方法之间的时间差异会更加显着。我知道,对于不同的机器,这些时间可能会有所不同,但是时间数量级的相对差异会保持不变。此外,我知道,平均时间可能是一个更好的指标,但我只是想显示两种方法之间时间消耗的数量级差异。我的机器/操作系统详细信息如下:
相关机器/操作系统/Matlab 详细信息:Athlon i686 Arch,Ubuntu 11.04 32 位,3gb ram,Matlab 2011b