teratail header banner
teratail header banner
質問するログイン新規登録
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2610閲覧

python 行列の掛け算 可到達行列

reds9

総合スコア5

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/30 13:32

編集2020/01/30 14:47

0

0

前提・実現したいこと

ある行列Aと単位行列Iがあるとき、
(A+I)n乗 = (A+I)n+1乗となる行列Mを可到達行列とします。

この可到達行列を、pythonで作成&表示したいです。

numpyを用いて、行列(A+I)を作成するところまではできましたが、
この後、for文でn乗し、一致したらbreakするコードを書こうとしましたが、分かりません。

どなたかよろしくお願いいたします。

発生している問題・エラーメッセージ

該当のソースコード

import

1 2arr1 = np.array([]) 3arr2 = np.eye() 4arr3 = arr1 + arr2 5 6for x in range(10000): 7 8 if 9 break 10 11print() 12 13 14コード

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/01/30 13:43

コードは「コードの挿入」で記入してください。
tiitoi

2020/01/30 14:29

可到達行列という用語について初めて聞いたのですが、任意の正方行列に対しても存在するのですか?
reds9

2020/01/30 14:49

説明不足でした。申し訳ございません。 任意の正方行列ですが、行列の各要素は、oか1の値しかとりません。 また可到達行列は英語で、reachability matrixです。
quickquip

2020/01/30 15:38

情報はこの欄ではなくて質問に追記しましょう。
can110

2020/01/30 16:31 編集

(A+I)での「+」とは具体的にどのような演算なのか各AとIと演算結果を具体的な数値(行列)で提示ください。 「(A+I)n乗」において「n乗」についても同様に提示ください。 また、「行列M」とは、(A+I)n乗 = (A+I)n+1乗となる場合の(A+I)を指すということでよいでしょうか? さらに「可到達行列」について参考になりそうなURLがあれば提示ください。 (http://ise.me.tut.ac.jp/lectures/decision-making/DSS12-2.pdf が引っかかってきましたが)
guest

回答1

0

ベストアンサー

numpy.array_equal(A, B) で行列 A と行列 B の値が等しいかどうか判定できるので、一致した場合はループを抜けるようにすればいいと思います。
また、行列積は A @ B で計算します。A * B だと要素ごとの積となってしまうので注意してください。

追記

ブール演算になっていなかったので、コードを修正しました。
numpy では、型が bool ならば、ブール演算になるようです。

python

1a = np.array([[True, True], 2 [True, False]]) 3b = np.array([[True, False], 4 [False, False]]) 5 6print(a + b) 7# [[ True True] 8# [ True False]] 9print(a @ b) 10# [[ True False] 11# [ True False]]

コード

python

1import numpy as np 2 3a = np.random.seed(5) 4 5A = np.random.randint(0, 2, (4, 4)).astype(bool) 6I = np.eye(len(A), dtype=bool) 7print(A.astype(int)) 8print(I.astype(int)) 9 10old = A + I 11 12for n in range(1, 100): 13 new = old @ (A + I) 14 if np.array_equal(old, new): 15 break # 同じなら抜ける 16 old = new 17 18ret = new.astype(int) 19print(f"(A + I)^{n - 1} = (A + I)^{n} =\n{ret}") 20# (A + I)^2 = (A + I)^3 = 21# [[1 0 1 1] 22# [1 1 1 1] 23# [0 0 1 0] 24# [1 0 1 1]]

隣接行列 A が表すグラフを確認したら、一応あっているっぽい

イメージ説明

投稿2020/01/30 15:19

編集2020/01/30 17:26
tiitoi

総合スコア21960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reds9

2020/01/30 15:34

早急なご回答、ありがとうございます。
quickquip

2020/01/30 15:43 編集

後学のため知りたいのですが、0か1の値しかとらないという制約はどこで実現しているのでしょう。 (手元にスマフォしかなくて…)
tiitoi

2020/01/30 15:58

コメントありがとうございます。 numpy.random.randint(0, 2, size) で [0, 2) の整数、つまり、0または1の整数値をとる行列を作っています。
tiitoi

2020/01/30 16:03

break したときの値見たら、オーバーフローしてておかしな事になってました。 質問の要件をそのまま解釈してコードにしましたが、収束していないみたいなので、自分が質問の要件を勘違いしているか、質問にかかれていない要件があるかもですね。
quickquip

2020/01/30 16:19

可到達行列というのは、値が0か1しかない、という定義なのです。 reds9さん、情報は質問への追記・修正の依頼欄に書かないで、質問を修正してください。そうでないと回答者が把握できないのでこういうことが起こります。 tiitoiさん、質問への追記・修正の依頼欄を見てみてください。
tiitoi

2020/01/30 17:17 編集

ご指摘ありがとうございます。 「行列の各要素は、0か1の値しかとりません。」は、最初の行列 A のことを言っているのだと思っていたのですが、そうではなく、0, 1 の値同士の演算は論理演算で行うということを言っていたのですね。 その点を読み違えていました。
reds9

2020/01/31 07:34

tiitoiさん 説明不足でご迷惑をおかけし、大変申し訳ございません。 無事に解決することができました。誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問