リスト同士の減算を行いたい
最終的にはansに共役勾配法の答えを格納するプログラムを作成しています.
その過程でリスト同士の減算を行いたいのですがエラーが解決できなくて困っております.
リスト同士の減算が推奨されていないのは理解していますが何かいい方法はないでしょうか.
よろしくお願いします.
発生している問題・エラーメッセージ
TypeError Traceback (most recent call last) <ipython-input-215-ef022784c545> in <module> 11 #print(mydot(a,b)) 12 ---> 13 ans = cg(a, b, x0) 14 #print(ans) <ipython-input-214-3f7771f15856> in cg(a, b, x_init) 2 x = x_init 3 ----> 4 r0 = (b - (mydot(A,x))) #r0 = (b - np.dot(A,x)) 5 p = r0 6 k = 0 TypeError: unsupported operand type(s) for -: 'list' and 'list'
該当のソースコード
Python
1from scipy.io import mmread 2import random 3import numpy as np 4 5def tenti(x): 6 return [list(j) for j in [i for i in zip(*x)]] 7 8def mydot(x, y): 9 10 y = tenti(y) 11 result = [] 12 13 for i in x: 14 subresult = [] 15 for j in y: 16 subresult.append(sum([k * m for k, m in zip(i, j)])) 17 result.append(subresult) 18 return result 19 20def cg(A, b, x0): 21 x = x0 22 23 r0 = (b - (mydot(A,x))) 24 25 #r0 = [e1 - e2 for e1, e2 in zip(b, (mydot(A,x)))] 26 27 #r2 = set(b) - set(mydot(A,x)) 28 #r0 = list(r2) 29 30 r0 = 31 p = r0 32 k = 0 33 for i in range(k < k+1): 34 a = (mydot((tenti(r0)),r0)) / (mydot(mydot((tenti(p)), A),p)) 35 x = x + p * a 36 r1 = r0 - (mydot(A*a, p)) 37 if np.linalg.norm(r1) < 1.0e-10: 38 k = k+1 39 return x 40 b = (mydot((tenti(r1)), r1)) / (mydot(tenti(r0)), r0) 41 p = r1 + b * p 42 r0 = r1 43 k = k+1 44 return x 45 46 47A = mmread('bcsstm01.mtx').todense() 48 49random.seed(1) 50b = [[random.randrange(10) for i in range(48)]] 51 52x0 = [[0]*48] 53 54ans = cg(A, b, x0)
試したこと
setを用いてリストを処理しようと試みましたが違うエラーが出てしまいうまくいきませんでした.
何か違う方法でアドバイスいただければ幸いです.
補足情報(FW/ツールのバージョンなど)
Python3.6.5使用
jupyter notebookで書いています
mmreadで読み込んでいるファイルは48*48の疎行列でmatrix marketから使用しているものです.
回答1件
あなたの回答
tips
プレビュー