python - 创建 2 x 2 矩阵并求其逆矩阵

标签 python multidimensional-array matrix-inverse

class multiDimensionalArray:

def __init__(self, numRows, numColumns):
    self.R = numRows
    self.C = numColumns

    self.array = [[(x+3*y) for x in range(self.R)] for y in range(self.C)]        

    self.inverse = [[]]

def modifyItem(self, row, column, item):
    self.array[row][column] = item

def getItem(self, row, column):
    print self.array[row][column]
    return self.array[row][column]

def showArray(self):
    print self.array

def changeSize(self, rows, columns):
    self.R = rows
    self.C = columns
    self.array = [[(x+3*y) for x in range(self.R)] for y in range(self.C)]

def getSize(self):
    print [self.R, self.C]
    return [self.R, self.C]

def getInverse(self):

    if ((self.R == 2) and (self.C == 2)):
        a = self.array[0][0]
        b = self.array[0][1]
        c = self.array[1][0]
        d = self.array[1][1]

        for L in self.array:
            for item in L:
                item = int(item)

        self.inverse[0][0] = d
        self.inverse[0][1] = b * (-1)
        self.inverse[1][0] = c * (-1)
        self.inverse[1][1] = a

        self.inverse = self.inverse * (1 / (a*d - b*c))
        print self.inverse
        return self.inverse


mat = multiDimensionalArray(2,2)
mat.showArray()
mat.getInverse()

此代码卡在以下代码行中。该错误显示“列表分配索引超出范围”。我的目标是使其完成给定 2x2 矩阵的数学逆运算。 谁能帮我让它工作吗?谢谢

self.inverse[0][0] = d
self.inverse[0][1] = b * (-1)
self.inverse[1][0] = c * (-1)
self.inverse[1][1] = a

最佳答案

有两个错误。

首先,将逆定义为 self.inverse = [[]]。它没有元素 [0][0],因此出现异常。您可以改为编写 self.inverse = [[0] * numColumns for i in range(numRows)] 以使用零矩阵初始化逆矩阵。

程序将在以下行失败:self.inverse = self.inverse * (1/(a*d - b*c)): Python 不知道如何将列表乘以一个号码。 做到这一点的一种方法可能是

k = 1 / (a*d - b*c)
self.inverse = [[x * k for x in u] for u in self.inverse]

另请注意,b * (-1) 可以简单地写成 -b

除此之外,这个类有点难看,但计算出的逆答案是正确的。我说丑陋,是因为通常矩阵类不会使用预定义的常量矩阵进行初始化,并且逆矩阵将是另一个矩阵,而不是成员。但我想只有测试才能准备更好、更完整的类(class)。

<小时/>

“就地”乘以 self.inverse 的元素(即不构建新矩阵):

for i in range(numRows):
    for j in range(numColumns):
        self.inverse[i][j] *= k

您也可以这样做:

for row in self.inverse:
    for j in range(numColumns):
        row[j] *= k

关于python - 创建 2 x 2 矩阵并求其逆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831521/

相关文章:

python - 如何将模型实例添加到 Django 查询集中?

python - 对于分类数据,如何在表格而不是列表中显示结果? (Jupyter 笔记本/Python)

python - 如何在 python 中定义多维数组?

php - 将php中的多维数组打印到html表中

c++ - 在 opencv 中反转的结果不正确

r - 在 R 中反转三角矩阵的方法是什么?

Python Pandas DF 根据列列表创建新变量

python - 为什么在函数中使用模块后重新导入会抛出异常?

java - ArrayList 中的数组问题,Java

r - 为什么乔列斯基分解不能得到与简单矩阵求逆相同的结果?