Octave / Matlab:如何将向量重复扩展?

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


你可以使用Kron - Kroencker乘积运算符。例如,v=[1 2]v100=kron(ones(1,100),v)是向量v100=[v v ... v](重复100次)。如果你想将某些列向量y与自身连接K次,则使用yK=kron(ones(K,1),y) - Pantelis Sopasakis
3个回答

142
你需要寻找的函数是repmat()
v10 = repmat(v, 1, 5)

1
Octave文档链接:http://www.gnu.org/software/octave/doc/interpreter/Special-Utility-Matrices.html#Special-Utility-Matrices - EIIPII

6
很明显,如果您知道要扩展向量的方向,repmat是最好的选择。
但是,如果您想要一种通用的解决方案,始终将向量重复到最长的方向,那么repmat和索引的组合应该可以解决问题:
 v10=v(repmat(1:length(v),1,5))

-1

虽然有些晚,但我还是发了这个帖子,因为这是类似问题这里最受欢迎的答案。

这是比repmatreshape快一级的更快的方法

做这种事情的最佳方法之一是使用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 时,相对于使用 reshaperepmat 可以显著节省时间。

我进行了一个小的 Matlab 测试,以检查 repmattony'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

以下是两种方法的时间(以秒为单位):

  • 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详细信息如下:

相关机器/操作系统/Matlab详细信息:Athlon i686 Arch,Ubuntu 11.04 32位,3GB RAM,Matlab 2011b


请不要重复回答。相反,请在问题下面留下指向此答案的评论。另外,根据我3年前的评论,这种方法已经不再更快了。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接