2017-05-25 65 views
0

我有这个矩阵错误的矩阵乘法导致不是元素个数相同

mpsim = 

    1.0e+04 * 

    -2.2331 
    -0.4261 
    1.3810 
    3.1880 
    4.9951 
    6.8022 
    8.6092 

这个矩阵

fvsim = 

     NaN  NaN  NaN  NaN  NaN  NaN  NaN 
     NaN  NaN  NaN  NaN  NaN  NaN  NaN 
     0   0 0.9000 0.1000   0   0   0 
     0   0   0 0.7500   0 0.2500   0 
     0   0   0   0   0 1.0000   0 
     0   0   0   0 0.5000   0 0.5000 
     0   0   0   0   0   0 1.0000 

这个矩阵

lingsim = 

    3 
    3 
    3 
    3 
    3 
    3 
    3 
    3 
    3 
    3 
    4 
    4 
    4 
    4 
    6 
    5 
    6 
    7 
    7 

我试图使用此代码,但出现错误

sizeA=size(mpsim,1); 
sizeB=size(fvsim,1); 
sizeC=size(lingsim,1); 
outputsim = zeros(size(lingsim)); 
for i=1:sizeC 
    if lingsim(i)<=sizeB 
     outputsim(i)=sum(mpsim * fvsim(lingsim(i), :)); 
    else 
     outputsim(i)=lingsim(i); 
    end 
end 
outputsim 
In an assignment A(I) = B, the number of elements in B and I must be the same. 

Error in ftskutes (line 131) 
     outputsim(i)=sum(mpsim * fvsim(lingsim(i), :)); 

如何解决这一问题?其实我假设sum(mpsim * fvsim(lingsim(i), :));是1x1,但是当我尝试检查它是1x7。

+0

这取决于你想要计算的东西。点产品,外部产品或元素产品。 – m7913d

+0

我想计算矩阵中两个向量的内积 –

+0

使用'dot'是我确定计算内积的最简单方法,正如我的答案中所建议的那样。 – m7913d

回答

3

问题是sum()只能在一个维度上工作 - 所以mpsim * fvsim(lingsim(i), :)产生一个7x7矩阵,然后它获得列总和,并在1x7向量中执行。

要获得所有元素的总和,你可以使用

if lingsim(i)<=sizeB 
    outputsim(i)=sum(sum(mpsim * fvsim(lingsim(i), :))); 
else 

编辑: 我以为你确实需要外产品的目的。然而,如果你想乘以每个元素进行,必须更换*同*和调换两种载体之一。

outputsim(i)=sum(mpsim' .* fvsim(lingsim(i), :)); 
+0

没有错误,但输出似乎是错误的outputsim = 1.0E + 05 * 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2。2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 2.2316 ,与实际工作输出,我需要这样= 1.0E + 04 * 1.5617 1.5617 1.5617 1.5617 1.5617 1.5617 1.5617 1.5617 1.5617 1.5617 4.0916 4.0916 4.0916 4.0916 6.8022 6.8022 6.8022 8.6092 8.6092 –

+2

要更换时间变量:'总和(SUM(A))' –

+0

THX,这个解决方案是隐藏在众目睽睽 –

1

当你乘的载体,你应该确保执行该操作你想:

  • 外积:(n x 1) * (1 x n) == (n x n)
  • 内(点)积:(1 x n) * (n x 1) == (1 x 1)
  • 的elementwise产品:(n x 1) .* (n x 1) == (n x 1)

mpsim是列矢量,即n x 1,并fvsim(lingsim(i), :)是一个行向量,即1 x n。因此,您正在计算外部产品

如果这不是您想要的,您可以采用转置(.')或内置函数dot来计算独立于矢量方向的点积。

+0

谢谢你这么多 –