在Python中查找矩阵的子矩阵

3
def getMatrixMinor(m,i,j):
    return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]

以下是我在Stack Overflow上找到的代码,用于查找矩阵的逆。然而,我对Python非常陌生。有人能解释一下使用此代码构建子矩阵的机制吗?
顺便说一句,我已经使用了这个代码,它可以工作,但我不明白它是如何工作的。

你已经了解 Python 切片(slice)的知识有多少了? - Rory Daulton
我知道row[:j]获取的是从索引0到j之前(不包括j)的所有元素,而row[j+1:]获取的是从j+1到末尾的所有元素。这样理解正确吗? - Thanakorn Pasangthien Ming
4个回答

2

让我们从矩阵的(i,j)次小矩阵的定义开始:

矩阵大小为n(i,j)次小矩阵是一个大小为n-1的较小矩阵,其中删除了第i行和第j列。

现在让我们看一下这个Python一行代码:

[row for row in (m[:i] + m[i+1:])]

m[:i] 给出矩阵 m 的前 i 行(请记住我们将矩阵表示为行的列表,并且在 Python 中,两个列表相加会得到一个更大的列表),现在让我们看另一个一行代码:

row[:j] + row[j+1:]

这给了我们一行中除了第j个元素之外的所有元素(lst[a:b]返回一个列表,其中包含lst中在ab之间的元素,不包括b

将上述两个组合起来,您将得到一个表达式,该表达式返回一个新矩阵,其中排除了第i行和第j列

def getMatrixMinor(m,i,j):
    return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]

哪个是次要矩阵。


哇!!这样就合理多了。非常感谢您,先生。 - Thanakorn Pasangthien Ming
谢谢你的建议,我刚刚开始真正使用StackOverflow,只是两天前才注册了该网站。 - Thanakorn Pasangthien Ming

0

这个函数非常简单,用于计算第一个小矩阵。假设你有一个大小为m x m的方阵,并且你想要计算在位置(i,j)处的第一个小矩阵,你该怎么办?你需要从原始矩阵中提取一个大小为(m-1) x (m-1)的较小矩阵,通过删除第i行和第j列来完成,这是由该函数完成的。

具体而言,m[:i]+m[i+1:]会删除第i行并创建剩余行的新列表。对于此列表中的每一行,该函数会删除元素row[j]。该函数的输出是表示相应小矩阵的列表列表(行)。

我建议您查看Python 列表推导式列表切片


非常感谢您,先生。非常感激。 - Thanakorn Pasangthien Ming

0

也许对某些人会有用,我想与你分享我的工作解决方案,欢迎任何建设性的批评。

def getMatrixMinor(arr,i,j):
    c = arr[:]
    c = np.delete(c, (i),axis=0)
    return [np.delete(row, (j),axis=0) for row in (c)]

作为实际例子,您可以查看我基于此行列式计算函数的实现这里

-1
# Finding minors of a matrix and it's determinant

import numpy as np
from numpy import *

n = 4
arr = random.randint(0,10,(n,n))
print(arr)

def getMatrixMinor(arr,i,j):
    c = arr[:]
    c_r = np.delete(c, (i),axis=0) # deletes i-th row
    c_c = np.delete(c_r, (j),axis=1) #deletes j-th column
    return c_c

gmm = getMatrixMinor(arr,2,2)
print("gmm = \n",gmm)

d = linalg.det(gmm)
print("d =",d)

    [[6 3 4 6]
     [0 8 5 2]
     [2 9 6 3]
     [6 5 2 1]]
    gmm = 
     [[6 3 6]
     [0 8 2]
     [6 5 1]]
     d = -263.99999999999994,
     
     Thanks GoAI, mine is a slight change from your answer.

1
请在代码块之外添加一些文本,实际上回答了“...有人能解释一下...”的问题。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接