模拟 .* 用于 matlab 中的张量/向量乘法

Analog to .* for tensor/ vector multiplications in matlab

我正在将 1-D 数值方法推广到 2-D,运行 带来了不便。我之前使用 b.*A 缩放数组中的每一行,其中 b 是 (nx1) 向量,A 是 (nxm) 数组。

是否有巧妙的操作可以将其扩展为张量?假设 B 是 (nxm1xm2)。当我试图找出如何做 b.*B 时,我不可避免地会抛出一个“数组维度必须与二进制数组操作匹配”。错误。

我宁愿使用某种内置方法或一种可爱的方式来映射乘法函数,也不愿使用 for 循环强制执行它以保持代码整洁和合理优化。

澄清

%I commonly use this product
A=[1,1,1;2,2,2;1,1,1];
b=[1;2;3];

b.*A

%I would like something similar to this which would multiply b(i) with B(:,:,i)
B=zeros(2,2,3);

B(:,:,1)=1;
B(:,:,2)=1;
B(:,:,3)=1;

b.*B

产出

ans =

     1     1     1
     4     4     4
     3     3     3

Array dimensions must match for binary array op.

Error in script4question (line 14)
b.*B
 

提前感谢您的宝贵时间。

尼克

您需要使尺寸在每个维度上都匹配。这意味着每个维度的大小需要与另一个数组中的大小相同,或者 1。在后一种情况下,implicit expansion 根据需要沿该维度复制大小为 1 的数组。

在你的例子中,b是3×1(×1),B是2×2×3,所以它们的大小不匹配。要实现您想要的效果,您需要使用 permute, shiftdim or reshape:

b 转换为 1×1×3 向量
reshape(b, 1, 1, []).*B

对于早于 R2016b 的 Matlab 版本,没有隐式扩展。在这种情况下,您可以使用 bsxfun:

获得相同的结果
bsxfun(@times, reshape(b, 1, 1, []), B)