科学計算では、微分演算子を計算する行列を作成する必要があることがよくあります。多くの場合、行列を明示的に作成するよりも、演算子を適用するコードを作成する方が簡単です。コードを取り (線形演算のみを使用すると仮定)、理想的にはスパース形式で行列を出力するライブラリはありますか?
例:
# computes finite differences
def myop(a):
return a[1:]-a[:-1]
a = np.array(5)
myop(a)
"a" ベクトルの有限差分を計算します。私は今、次のようなことをしたい
a = some_library.array(5)
op = myop(a)
print(op.as_matrix())
これにより、行列表現が得られます。
[[-1, 1, 0, 0, 0],
[0, -1, 1, 0, 0],
[0, 0, -1, 1, 0],
[0, 0, 0, -1, 1]]
行列を持つことは、転置演算子の計算やスパース パターンの分析などに非常に役立ちます。技術的には、自動微分ツールを使用して op() のヤコビアンを抽出できるはずですが、ヤコビアン全体を効率的に処理する AD ライブラリは見つかりませんでした。特にスパースな場合はそうです。それらはすべて、ヤコビアンの行ごとまたは列ごとに 1 つのパスを実行するように見えますが、これは変数が数百しかない場合でも恐ろしく遅くなります。