和往常一样,我希望能从以下代码中获得一些帮助。
我需要完成以下任务:
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]
我需要能够将
each
的x
值与every
的A
值相乘,这意味着: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.
最佳答案
将x
发送到第三维,以便将bsxfun
与A
进行乘法运算时单例扩展生效,从而将乘积结果扩展到第三维。然后,执行bsxfun
乘法-
val = bsxfun(@times,A,permute(x,[3 1 2]))
现在,
val
是一个3D
矩阵,并且期望的输出将是沿着第三个维度沿列连接的2D
矩阵。这是通过以下方式实现的:out = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[])
希望有道理!传播
bsxfun
一词!呜! :)关于performance - bsxfun在矩阵乘法中的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23807960/