あなたのテストでは、最初のチェックの後にすぐに戻ります。行列が逆対称であるかどうかをテストするには、対(i、j)がA[i][j] != -A[j][i]
になるまで検査を続ける必要があります。
ほとんどの場合、インデックスを使用するのではなく、コンテナ内の項目を直接ループする方がよいでしょう。行列を転置するために、我々はビルトインzip
機能を使用することができます
def is_antisymmetric(m):
# Transpose matrix m
t = zip(*m)
#Check each row against each column
for row, col in zip(m, t):
#Test that each item in the row is the negative
# of the corresponding column item
for u, v in zip(row, col):
if u != -v:
return False
return True
# Test
data = (
# Not anti-symmetric
[[0, 1, 2],
[-1, 0, -2],
[2, 2, 3]],
# Anti-symmetric
[[0, 1, 2],
[-1, 0, -2],
[-2, 2, 0]],
)
for m in data:
for row in m:
print(row)
print(is_antisymmetric(m))
出力を
[0, 1, 2]
[-1, 0, -2]
[2, 2, 3]
False
[0, 1, 2]
[-1, 0, -2]
[-2, 2, 0]
True
我々は
all
関数内ジェネレータ式を使って、よりコンパクトな機能を作ることができます
:
def is_antisymmetric(m):
return all([-u for u in col] == row for row, col in zip(m, zip(*m)))
all
関数は、arが見つかるとすぐにテストを停止します。それは対応する列と等しくありません。また、==
テストでは、不一致が見つかると直ちに現在の行と現在の列との比較が中止されるため、このコードは以前のバージョンと同等ですが、少し効率的です。しかし、ジェネレータ表現に慣れていないと読みにくいかもしれません。 :)
FWIW、この回答のコードはすべてPython 2とPython 3で動作し、任意のサイズの正方行列を処理します。
最初のものは0です。 – muddyfish
0 == -0と世界は期待どおりに動作します。 –
A [0] [0] == 0のためA [0] [0] == -A [0] [0] – tianwei