回答編集履歴

3

d

2019/06/24 07:03

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -195,3 +195,111 @@
195
195
  return ret
196
196
 
197
197
  ```
198
+
199
+
200
+
201
+ ## 追記
202
+
203
+
204
+
205
+ > ↓これは[[0]]と出るのですが二次元配列ですか。
206
+
207
+ > ret = [[0 for j in range(B_cols)] for i in range(A_rows)]
208
+
209
+ > ここにインデックスをあらかじめ指定して代入するということですかね?
210
+
211
+ > [[0]]と表示されているのにIndex out of rangeみたいなエラーが出ないので不思議でした
212
+
213
+
214
+
215
+ 例えば、(2, 2) と (2, 3) の行列積であれば、結果は (2, 3) の行列となるので、(2, 3) の値がすべて0の行列を Python の内包記法で作成しています。
216
+
217
+
218
+
219
+ [pythonの内包表記を少し詳しく - Qiita](https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)
220
+
221
+
222
+
223
+ ```python
224
+
225
+ ret = [[0 for j in range(3)] for i in range(2)]
226
+
227
+ print(ret)
228
+
229
+ # [[0, 0, 0],
230
+
231
+ # [0, 0, 0]]
232
+
233
+ ```
234
+
235
+
236
+
237
+ 具体的な例で各出力がどうなるかをコメントに記載したコード
238
+
239
+
240
+
241
+ ```python
242
+
243
+ A = [[1, 2],
244
+
245
+ [3, 4]]
246
+
247
+ B = [[5, 6, 7],
248
+
249
+ [8, 9, 10]]
250
+
251
+
252
+
253
+ A_rows, A_cols = len(A), len(A[0]) # A の行数及び列数
254
+
255
+ print(f"({A_rows}, {A_cols})") # (2, 2)
256
+
257
+ B_rows, B_cols = len(B), len(B[0]) # B の行数及び列数
258
+
259
+ print(f"({B_rows}, {B_cols})") # (3, 2)
260
+
261
+
262
+
263
+ if A_cols != B_rows:
264
+
265
+ print("Could not compute")
266
+
267
+ exit(1)
268
+
269
+
270
+
271
+ # 0で初期化した 2x3 行列を作成する。
272
+
273
+ ret = [[0 for j in range(B_cols)] for i in range(A_rows)]
274
+
275
+ print(ret)
276
+
277
+ # [[0, 0, 0],
278
+
279
+ # [0, 0, 0]]
280
+
281
+
282
+
283
+ for i in range(A_rows):
284
+
285
+ for j in range(B_cols):
286
+
287
+ for k in range(A_cols):
288
+
289
+ ret[i][j] += A[i][k] * B[k][j]
290
+
291
+ ```
292
+
293
+
294
+
295
+ > あと↓ですがかけたものを足しているということでいいですか?勉強不足のせいか読み方が分かりません・・・。
296
+
297
+ > C_{ij} = \sum_k^M A_{ik} B_{kj}
298
+
299
+
300
+
301
+ 行列積の定義です。Tex 記法が teratail だとコンパイルされないので、tex のままになっていますが、以下の行列積の定義を書きました。
302
+
303
+
304
+
305
+ ![イメージ説明](b29ad4634232fcf913fd3d744766848f.png)

2

d

2019/06/24 07:03

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -150,7 +150,7 @@
150
150
 
151
151
 
152
152
 
153
- C_{ij} = \sum_k^M a_{ik} b{kj}
153
+ `C_{ij} = \sum_k^M A_{ik} B_{kj}`
154
154
 
155
155
 
156
156
 

1

d

2019/06/21 04:00

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -137,3 +137,61 @@
137
137
  print(f"{num_ok} / {num_tests}") # 10000 / 10000
138
138
 
139
139
  ```
140
+
141
+
142
+
143
+ ## 補足
144
+
145
+
146
+
147
+ A: (N, M) の行列, B: (M, L) の行列としたとき、
148
+
149
+ 行列積 C は (N, L) の行列でその (i, j) 成分は
150
+
151
+
152
+
153
+ C_{ij} = \sum_k^M a_{ik} b{kj}
154
+
155
+
156
+
157
+ なので、定義に従い書くと以下のようになる。
158
+
159
+
160
+
161
+ ```python
162
+
163
+ def matrix_multiplication(A, B):
164
+
165
+ A_rows, A_cols = len(A), len(A[0]) # A の行数及び列数
166
+
167
+ B_rows, B_cols = len(B), len(B[0]) # B の行数及び列数
168
+
169
+
170
+
171
+ if A_cols != B_rows:
172
+
173
+ print("Could not compute")
174
+
175
+ return None
176
+
177
+
178
+
179
+ # (A_rows, B_cols) の0で初期化した行列を作成する。
180
+
181
+ ret = [[0 for j in range(B_cols)] for i in range(A_rows)]
182
+
183
+
184
+
185
+ for i in range(A_rows):
186
+
187
+ for j in range(B_cols):
188
+
189
+ for k in range(A_cols):
190
+
191
+ ret[i][j] += A[i][k] * B[k][j]
192
+
193
+
194
+
195
+ return ret
196
+
197
+ ```