【问题标题】:repmat vs simple matrix multiplication in MATLABMATLAB中的repmat与简单矩阵乘法
【发布时间】:2017-08-24 08:17:33
【问题描述】:

v 为长度为 n 的行向量。目标是创建一个矩阵A,其中 m 行都等于 v。

MATLAB 有一个名为 repmat 的函数。可能的代码是

A = repmat(v,[m 1])

还有一种使用简单矩阵运算的同样简洁的方法

A = ones(m,1)*v

对于较大的 m 和 n,这两种方法是否更可取?

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    让我们比较一下!

    在测试算法时,有 2 个指标很重要:时间和内存。

    让我们从时间开始:

    显然 repmat 赢了!

    内存:

    profile -memory on
    for m=1000:1000:50000
    f1=@()(repmat(v,[m 1]));
    f2=@()(ones(m,1)*v);
    ii=ii+1;
    t1(ii)=timeit(f1);
    t2(ii)=timeit(f2);
    end
    profreport
    

    似乎两者都占用相同数量的内存。但是,分析器以not showing all the memory 闻名,因此我们不能完全信任它。

    不过,很明显 repmat 更好

    【讨论】:

      【解决方案2】:

      您应该使用repmat()

      矩阵乘法是 O(n ^ 3) 运算,比在内存中复制数据要慢得多。
      最重要的是,第二个选项在输出大小的内存中分配更多数据。

      在上面的例子中,你创建了一个外部乘法更快但仍然不是内存操作的向量。

      MATLAB 不使用所有向量元素均为 1 的知识,因此您将 x 的每个元素乘以 1 m 倍。

      这两个操作都将主要是内存限制的,但更高效、快速和直接的方法将与 repmat() 一起使用。

      问题是,之后你会做什么?
      因为你可能不需要repmat()

      【讨论】:

      • “矩阵乘法是 O(n ^ 3)”。 你的矩阵乘法很慢,而不是 MALTAB。
      • stackoverflow.com/questions/6058139/…。回答者是 Mathworks 的员工。
      • 您最好在这里阅读:stackoverflow.com/questions/17716565/… 您会发现这些方法并不实用。 Intel MKL 是 O(n ^ 3) 算法,对内存带宽和缓存一致性的利用最好,但仍然是 O(n ^ 3)。
      • 解决它的唯一方法是寻找矩阵的特殊属性并为此执行专门的操作(实际上 MATLAB 会这样做)。
      • O(n^3) 将两个 nxn 矩阵相乘。将两个大小为 n 和 m 的向量相乘显然是一个需要 n*m 次乘法的运算。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2021-12-04
      相关资源
      最近更新 更多