【问题标题】:Octave / Matlab: Extend a vector making it repeat itself?Octave / Matlab:扩展向量使其重复?
【发布时间】:2011-01-28 10:14:08
【问题描述】:

有没有办法通过重复自身来扩展向量?

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

标签: matlab vector octave


【解决方案1】:

您要查找的函数是repmat()

v10 = repmat(v, 1, 5)
【解决方案2】:

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

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

 v10=v(repmat(1:length(v),1,5))

【讨论】:

    【解决方案3】:

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

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

    执行此类操作的最佳方法之一是使用Tony's Trick. 我在哥伦比亚大学的电气工程课程讲义之一中遇到了这个技巧。通常发现 Repmat 和 Reshape 比 Tony 的技巧慢,因为它直接使用 Matlabs 固有索引。为了回答你的问题,

    比方说,您想将行向量 r=[1 2 3] Nr=[1 2 3 1 2 3 1 2 3...] 一样平铺,然后,

    c=r'
    cc=c(:,ones(N,1));
    r_tiled = cc(:)';
    

    reshaperepmat 相比,对于大型N,此方法可显着节省时间。

    我进行了一个小的 Matlab 测试来检查 repmattony's trick 之间的速度差异。使用下面提到的代码,我计算了从基向量A=[1:N] 构造相同平铺向量的时间。结果表明,是的,Tony's-Trick 比 MAGNITUDE 更快,尤其是对于较大的 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

    【讨论】:

    • 请不要重复答案。相反,请在指向此答案的问题下留下评论。此外,根据我 3 年前的评论,这种方法不再更快。
    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 2014-07-14
    • 1970-01-01
    • 2011-10-21
    • 2013-12-22
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多