95

有没有办法通过使其重复来扩展向量?

>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]

4

3 回答 3

142

您正在寻找的功能是repmat().

v10 = repmat(v, 1, 5)
于 2010-03-17T04:11:00.820 回答
6

如果您知道要在哪个方向扩展向量,显然 repmat 是要走的路。

但是,如果您想要一个始终在最长方向上重复向量的通用解决方案,那么 repmat 和索引的这种组合应该可以解决问题:

 v10=v(repmat(1:length(v),1,5))
于 2013-04-23T14:28:10.910 回答
-1

虽然迟到了,但我发布了这个,因为事实证明这是对类似问题的最受欢迎的答案。

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

做这些事情的最好方法之一是使用托尼的技巧。我在哥伦比亚大学的电气工程课程讲义之一中遇到了这个技巧。通常发现 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,此方法可显着节省时间。repmatN

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

下面给出了两种方法的时间(以秒为单位);

  • 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

于 2021-09-27T02:42:42.323 回答