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