为什么是数字.dot()引发ValueError:形状未对齐?

2024-10-04 07:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个程序,通过迭代一个猜想(Rayleigh商迭代)来找到Hermitian矩阵的特征向量和特征值。我有一个测试矩阵,我知道的特征向量和特征值,但当我运行我的代码,我收到

ValueError: shapes (3,1) and (3,1) not aligned: 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()函数的变量的维数是错误的,但是我找不到在哪里。在我的调试过程中,所有内容都被拆分并重新命名,我知道这看起来很难阅读。你知道吗


Tags: 代码importnp矩阵dotb1errdim
1条回答
网友
1楼 · 发布于 2024-10-04 07:34:21

数学问题是形状(3,1)和(3,1)的矩阵乘法。基本上是两个向量。也许你想用转置矩阵来做这个?你知道吗

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

看看^{}的文档,看看哪些参数是可以接受的。你知道吗

If both a and b are 1-D arrays, it is inner product of vectors (...)

If both a and b are 2-D arrays, it is matrix multiplication (...)

您使用的变量是形状(3,1),因此是二维数组。你知道吗

另外,这意味着,也可以使用阵列的平面视图,而不是转置第一个矩阵。这样,它的形状(3,)和1-D数组,你会得到内积:

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

相关问题 更多 >