【发布时间】:2014-07-11 13:23:24
【问题描述】:
一如既往地尝试向您学习更多信息,我希望能通过以下代码获得一些帮助。
我需要完成以下工作:
1) 我有一个向量:
x = [1 2 3 4 5 6 7 8 9 10 11 12]
2) 和一个矩阵:
A =[11 14 1
5 8 18
10 8 19
13 20 16]
我需要能够将来自x 的each 值与A 的every 值相乘,这意味着:
new_matrix = [1* A
2* A
3* A
...
12* A]
这将给我这个new_matrix 大小为(12*m x n) 假设A (mxn)。在这种情况下(12*4x3)
如何使用 matlab 中的bsxfun 来做到这一点?而且,这种方法会比for-loop 更快吗?
关于我的for-loop,我在这里也需要一些帮助...当循环运行时,我无法存储每个"new_matrix" :(
for i=x
new_matrix = A.*x(i)
end
提前致谢!!
编辑:在给出的解决方案之后
第一个解决方案
clear all
clc
x=1:0.1:50;
A = rand(1000,1000);
tic
val = bsxfun(@times,A,permute(x,[3 1 2]));
out = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[]);
toc
输出:
Elapsed time is 7.597939 seconds.
第二种解决方案
clear all
clc
x=1:0.1:50;
A = rand(1000,1000);
tic
Ps = kron(x.',A);
toc
输出:
Elapsed time is 48.445417 seconds.
【问题讨论】:
-
for循环可以通过预先定义
new_matrix的大小来完成,就像你自己说的那样,然后使用索引告诉你的new_matrix你希望这些元素保存在哪里,例如在您上面给出的代码new_matrix(((i-1)*12+1):(i*12))) = A.*x(i)中,我只是在这里写的,所以不确定它是否有效。 -
谢谢@Minion,我会检查它是否有效,我会告诉你!
-
@Minion 它几乎可以工作,我在
1*new_matrix、2*new_matrix3*new_matrix...等等其他一些我不知道它们来自哪里的计算之间得到了一些东西。 -
@SergioHaram 感谢您发布这个问题!希望这对对
bsxfun感兴趣的人会派上用场。 -
酷!一些基准测试结果!!感谢您发布这些!
标签: performance matlab matrix matrix-multiplication bsxfun