2

This program tests if a matrix is an identity matrix or not.

I have pasted my code beneath, and would like to know ways in which I can optimize the efficiency of this code. Also I am new to python programming, are there some built in functions that can solve the purpose too?

    def is_identity_matrix(test):
    if (test == []):
        return False
    i = 0
    while (i < len(test)):
        if (len(test[i]) == len(test)):
            j = 0
            while(j < len(test[i])):
                if (j != i):
                    if(test[i][j] != 0):
                        return False
                else:
                    if(test[i][j] != 1):
                        return False
                if(j == (len(test[i]) - 1)):
                    break
                j += 1
            if(i == (len(test) - 1)):
                break
            i += 1
        else:
            return False
    if(i == j and i == (len(test) - 1)):
        return True

# Test Cases:

matrix1 = [[1,0,0,0],
           [0,1,0,0],
           [0,0,1,0],
           [0,0,0,1]]
print is_identity_matrix(matrix1)
#>>>True

matrix2 = [[1,0,0],
           [0,1,0],
           [0,0,0]]

print is_identity_matrix(matrix2)
#>>>False

matrix3 = [[2,0,0],
           [0,2,0],
           [0,0,2]]

print is_identity_matrix(matrix3)
#>>>False

matrix4 = [[1,0,0,0],
           [0,1,1,0],
           [0,0,0,1]]

print is_identity_matrix(matrix4)
#>>>False

matrix5 = [[1,0,0,0,0,0,0,0,0]]

print is_identity_matrix(matrix5)
#>>>False

matrix6 = [[1,0,0,0],  
           [0,1,0,2],  
           [0,0,1,0],  
           [0,0,0,1]]

print is_identity_matrix(matrix6)
#>>>False
4

6 に答える 6

13
def is_identity_matrix(listoflist):
    return all(val == (x == y) 
        for y, row in enumerate(listoflist)  
            for x, val in enumerate(row))

(ただし、これは行列が正方かどうかをチェックせず、空のリストに対して True を返します)

説明: 内部には、行列内の各値をループするallネストされたループを持つジェネレーター式があります。対角線上およびその他の場所に評価されます。Python では、とを比較できます。括弧は重要です: と同等の連鎖比較になりますvalx == yTrueFalseTrue == 1False == 0val == (x == y)val == x == yval == x and x == y

于 2013-05-17T17:00:49.767 に答える
6

私は使用しますnumpy

(np.array(matrix1) == np.identity(len(matrix1))).all()

もちろん、matrix1変換を避けるために、最初から numpy 配列として保存していたほうがよいでしょう。

于 2013-05-17T16:55:00.610 に答える
1

行列のサイズを確認し、nxn であることを確認してから、np.identity(n) を使用して実際の恒等行列を作成し、作成した新しい行列と行列を比較します。

于 2013-05-17T17:00:26.537 に答える
1
def is_identity_matrix(test):
    if not test : return False
    le = len(test[0])
    for i,x in enumerate(test):
        if len(x) == le:
            if any(y!=1 if j==i else y!=0 for j,y in enumerate(x)):
                return False
        else:
            return False
    return True if len(test) == le else False
于 2013-05-17T17:14:40.373 に答える
0

速度が重要な場合は、おそらく Numpy を検討する必要がありますが、Numpy を使用できない場合や、行列を Numpy 配列として使用する価値がない場合は、次を使用することもできます。

def is_identity(mat):
    for i, row in enumerate(mat):
        if any(row[:i]) or row[i]!=1 or any(row[i+1:]):
            return False
    return True

現在受け入れられている回答のコードよりも約 12 倍高速です。少なくとも 2000x2000 のマトリックスの場合...

上記は行列の次元をチェックしませんが、次のようなものを簡単に追加できます。

n = len(matrix)
if not all(len(row) == n for row in matrix):
    return False
于 2013-11-13T23:13:03.480 に答える