【发布时间】: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,这两种方法是否更可取?
【问题讨论】:
设v 为长度为 n 的行向量。目标是创建一个矩阵A,其中 m 行都等于 v。
MATLAB 有一个名为 repmat 的函数。可能的代码是
A = repmat(v,[m 1])
还有一种使用简单矩阵运算的同样简洁的方法
A = ones(m,1)*v
对于较大的 m 和 n,这两种方法是否更可取?
【问题讨论】:
让我们比较一下!
在测试算法时,有 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 更好
【讨论】:
您应该使用repmat()。
矩阵乘法是 O(n ^ 3) 运算,比在内存中复制数据要慢得多。
最重要的是,第二个选项在输出大小的内存中分配更多数据。
在上面的例子中,你创建了一个外部乘法更快但仍然不是内存操作的向量。
MATLAB 不使用所有向量元素均为 1 的知识,因此您将 x 的每个元素乘以 1 m 倍。
这两个操作都将主要是内存限制的,但更高效、快速和直接的方法将与 repmat() 一起使用。
问题是,之后你会做什么?
因为你可能不需要repmat()。
【讨论】: