【发布时间】:2015-10-02 09:36:47
【问题描述】:
给定一个矩阵和一个向量
A = [ 1 2; 2 4 ];
v = [ 2 4 ];
如何将矩阵的每一列除以向量的相应元素?下面的矩阵应该是
[ 1/2 2/4; 2/2 4/4 ]
基本上我想应用按列操作,每列的操作数存储在一个单独的向量中。
【问题讨论】:
给定一个矩阵和一个向量
A = [ 1 2; 2 4 ];
v = [ 2 4 ];
如何将矩阵的每一列除以向量的相应元素?下面的矩阵应该是
[ 1/2 2/4; 2/2 4/4 ]
基本上我想应用按列操作,每列的操作数存储在一个单独的向量中。
【问题讨论】:
【讨论】:
bsxfun 执行复制,因此引擎盖下的内存使用量也会增加,因此您可能需要在答案中的最后一个断言中小心。但是,它肯定比repmat 快,所以这是一个不错的选择。在此处查看一些出色的基准测试:stackoverflow.com/questions/12951453/…。另外,请参阅此处有关bsxfun 的内存使用情况:stackoverflow.com/questions/29800560/…
bsxfun 只是在重复使用现有的数组,但我认为我对此没有实际的参考。但我同意,bsxfun 比repmat 更快,内存效率更高,所以没有任何理由不使用它。
repmat相比,它非常小,所以我认为你的最后一个断言是正确的。我收回了!
使用 bsxfun 和右除 (rdivide) 运算符并利用广播:
>> A = [ 1 2; 2 4 ];
>> v = [ 2 4 ];
>> out = bsxfun(@rdivide, A, v)
out =
0.5000 0.5000
1.0000 1.0000
bsxfun 的美妙之处在于,在这种情况下,v 的值将被复制到与A 中一样多的行,并且它将使用这个临时复制的矩阵执行元素智能除法A 中的值。
【讨论】: