【问题标题】:Alternative of repmat for large vectors in matlabmatlab中大向量的repmat替代方案
【发布时间】:2014-07-07 14:34:32
【问题描述】:

我正在编写一个代码,其中减少速度和时间非常重要。我必须通过重复一些向量来创建一些矩阵。由于我的向量几乎很大,因此使用 repmat 创建这些矩阵需要相对较长的时间。有没有其他方法可以减少这个时间?

【问题讨论】:

  • 为什么首先需要复制这些向量?也许您可以使用bsxfun 完全避免这种复制?
  • 虽然我不排除击败 repmat 的可能性,但也没有那么糟糕。因此,您可能希望研究矩阵的创建和使用。
  • @user3482383 请在bsxfun 上查看matlab 的帮助。您还可以在 bsxfun 标签 wiki 上查看一些示例。
  • 如果你真的看到repmat 显示为分析器中的瓶颈,我能给出的唯一解释是 1) 你的向量包含由@987654327 深度复制的用户实现的类型@, 2) 你的内存用完了,MATLAB 正在分页到硬盘,在这种情况下,bsxfun 和朋友可以派上用场(或者以某种方式自己实现隐式复制)。 repmat 非常高效,我强烈怀疑它是否是真正的瓶颈。

标签: matlab vector matrix


【解决方案1】:

我们的测试向量:

V0 = [1; 2; 3]; 

托尼的诡计:

V1 = V0(:, ones(3,1))

矩阵/向量乘法:

V2 = V0 * ones(1,3);    

克罗内克产品:

V3 = kron(V0, ones(1,3))

串联:

V4 = [V0 V0 V0]

不明显的方式:

V5 = arrayfun(@(~)V0, 1:3, 'uniformoutput', false);
V5 = cat(2, V5{:});

最不明显的方式:

[Vi{1:3}] = deal(V0);
V6 = [Vi{:}]

使用Lightspeed toolbox 中的repmat

或者,最好的方法是使用隐式扩展(R2008 及更高版本):

%# NOTE: this PREVENTS having to do explicit replication, and carries 
%# out the multiplication re-using the same elements from V0: 
M = bsxfun(@times, rand(1,5), V0)

【讨论】:

  • 对于最后一个我希望ones(1,5)ones(3,5)。提问者的小旁注:也许并非所有这些方法都比 repmat 更快。
  • @DennisJaheruddin:最后一个是表明您不需要显式复制的向量,但您可以执行任何乘法/加法/等。隐式复制。因此,我将输出命名为 M 而不是 V7 :)
  • @DennisJaheruddin:另外,你是对的 :) repmat 非常快,并且在 lightspeed 工具箱中的实现对于现代 MATLAB 来说是失败的,除了一些几乎从未遇到过的小众案例。即便如此,它也几乎不是瓶颈。我怀疑OP有一个完全不同的问题。我只是在尝试想出更多方法来做这件事时很开心:)
  • @RodyOldenhuis 如果我可以在较小的向量上做 repmat 的事情但更多次,时间有什么不同吗?
  • +1 您需要将arrayfun 行更改为V5 = arrayfun(@(~)V0, 1:3, 'uniformoutput', 0);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2021-10-07
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多