我有2个矩阵A(nxm)和B(nxd),并希望将A的每一列与B行的元素相乘.A中有m列,B中有n个1xd向量,因此结果是m nxd矩阵 . 然后我想求和(result_i,1)得到m 1xd向量,我想应用vertcat来获得mxd矩阵 . 我正在使用for循环执行此操作,并且它很慢,因为n和d很大 . 如何在matlab中对其进行矢量化以使其更快?谢谢 .
EDIT:
你没事:我对自己的问题感到困惑 . 我的意思是“将每个A的每一列与一行B相乘”是将A中列的n个元素与B的相应n行相乘 . 我想要对A的一列进行如下操作(我对m列的A重复此操作,然后将C的向量一起拖动以获得mxd矩阵):
column_of_A =
3
3
1
B =
3 1 3 3
2 2 1 2
1 3 3 3
C = sum(diag(column_of_A)*B, 1)
16 12 15 18
3 回答
您可以通过以下方式对操作进行矢量化 . 但请注意,矢量化是以更高的内存使用量为代价的,因此解决方案最终可能无法为您工作 .
您可能希望在一行中完成所有操作,这可能有助于Matlab JIT编译器节省内存 .
EDIT
这里's a way to replace the first line if you don'吨有
bsxfun
这很难看,但据我所见,它很有效 . 我不确定它会比你的循环更快,而且它有很大的内存开销 . 无论如何,这里是:
它的作用是:将A制作成尺寸为n x 1 x m的3D矩阵,因此在第3维的每个索引中都有一列 . 然后我们重复矩阵,这样我们得到一个n x d x m矩阵 . 我们也在第三维中重复B.然后,我们对所有元素进行分段乘法并求它们 . 得到的矩阵是1×d×m矩阵 . 我们将其重塑为m x d矩阵 .
我很确定在我的解释中我几次调整了尺寸的大小,但我希望你得到一般的要点 .
与对角矩阵相乘似乎至少快两倍,但我找不到使用diag的方法,因为它需要矢量或2D矩阵作为输入 . 我今晚可能会再试一次,我觉得必须有更快的方式:) .
[Edit] 将命令分成几部分,至少使其有点可读 .
这是我这样做的方式:
如果你不知道B的列数: