为什么numpy.dot()抛出ValueError:形状未对齐?

问题描述 投票:1回答:1

我想编写一个程序,通过迭代猜测(瑞利商迭代)来找到埃尔米特矩阵的特征向量和特征值。我有一个测试矩阵,知道该矩阵的特征向量和特征值,但是当我运行代码时,会收到

ValueError:形状(3,1)和(3,1)未对齐:1(dim 1)!= 3(dim 0)

通过将每个分子和分母拆分为单独的变量,我将问题追到了这一行:

nm=np.dot(np.conj(b1),np.dot(A,b1))

我的代码:

import numpy as np
import numpy.linalg as npl

def eigen(A,mu,b,err):

    mu0=mu
    mu1=mu+10*err

    while mu1-mu > err:

        n=np.dot((npl.inv(A-mu*np.identity(np.shape(A)[0]))),b)
        d=npl.norm(np.dot((npl.inv(A-(mu*np.identity(np.shape(A)[0])))),b))

        b1=n/d
        b=b1

        nm=np.dot(np.conj(b1),np.dot(A,b1))
        dm=np.dot(np.conj(b1),b1)

        mu1=nm/dm
        mu=mu1

    return(mu,b)

A=np.array([[1,2,3],[1,2,1],[3,2,1]])
mu=4
b=np.array([[1],[2],[1]])
err=0.1

eigen(A,mu,b,err) 

我相信输入到np.dot()函数中的变量的尺寸是错误的,但是我找不到位置。在调试过程中,所有内容都被拆分并重命名,我知道它看起来很难阅读。

python numpy eigenvalue eigenvector
1个回答
1
投票

数学问题是形状(3,1)和(3,1)的矩阵相乘。这实际上是两个向量。也许您想使用转置矩阵来做到这一点?

nm = np.dot(np.conj(b1).T, np.dot(A, b1))
dm = np.dot(np.conj(b1).T, b1)

请参阅np.dot的文档,以了解可接受的参数。

如果a和b都是一维数组,则它是向量的内积(...)

如果a和b均为二维数组,则为矩阵乘法(...)

您正在使用的变量的形状为(3,1),因此为二维数组。

此外,这意味着,代替转置第一个矩阵,您可以使用数组的展平视图(1-D):

np.dot
© www.soinside.com 2019 - 2024. All rights reserved.