Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(1) 複素行列を定義して一次方程式や逆行列、行列式などを計算する。
周りの若者の使う言語でC#が流行ってきている(データサイエンティストとかじゃ全くない分野ですよ!)。
私つかったことないなー、と思ってちょっとやってみよう。高周波関係のもので作りたいものがあるし。
今はVisual Studioは2022が最新だが、都合上2019を使う。ちなみにC#ってTwitterで文にすると#はハッシュタグになってなんかうまく検索できないのでC_sharpもタイトルにつけた。
で、数学ライブラリって何が使える?と思って探すとMath.NET Numericsというのがよさげ。
Math.NET Numerics
ただあんまり文献がない。しかも本家のサイトの説明がとても不親切…(Githubでソース見ろということかもしれないが)。
なので動かす記録を残す。
まずはNuGetでMath.NET Numericsをとってくる…というのがそもそも.NETを使ってなかった私は???と思った。
なんでもいいからソリューションを立ち上げて、プロジェクト→NuGetの管理、という項目を選んで、
参照で、Mathとでも検索してMathNet.Numericsを選ぶ。これでインストールすればこのソリューションで使えるようになる。
使うときは最初に
using MathNet.Numerics;
をつければOK。
で、まず使いたいのは複素数の行列。
Complexを使うためには、
using System.Numerics;
が必要。MathNet.Numericsも複素数型はあるのだが、Complex32という単精度になってしまう。
ただ後述しますが、こいつを使うとVectorの定義が2つできてしまう。
さて、行列を使うには、
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Complex;
のどちらかによって設定が違う!
まず上を使う場合、密行列を使うなら(疎行列も対角行列も使えますがとりあえず)
var A = Matrix<Complex>.Build.DenseOfArray(new Complex[,]
{
{ 2.0, 1.0, 1.0},
{ -1.0, 1.0, -1.0},
{ 1.0, 2.0, 3.0}
}
);
var b = MathNet.Numerics.LinearAlgebra.Vector<Complex>.Build.DenseOfArray(new Complex[]
{2.0, 3.0, -10.0});
のようにする。DenseとBuildを使う。
ここでわざわざVectorのほうにMathNet.Numerics.LinearAlgebra.をつけてるのがさっき言ったSystem.NumericsのVectorとかぶるから。
DoubleだけつかうときはSystem.Numericsをなくせばいいが、倍精度の複素数を使うときはそうはいかないとので。
下を使う場合は
var A1 = DenseMatrix.OfArray(new Complex[,]
{
{ 2.0, 1.0, 1.0},
{ -1.0, 1.0, -1.0},
{ 1.0, 2.0, 3.0}
}
);
var b1 = DenseVector.OfArray(new Complex[]
{2.0, 3.0, -10.0});
のようにする。DenseMatrixを使う。この書き方が本家のサイトで混在していてよくわからなかったのだった。まあ最初で統一すべきな気がする。
ただここまで来たら後は簡単で、Ax=bを計算するのは
var x = A.Solve(b);
でいいし、逆行列は
A.Inverse();
行列式は
A.Determinant();
でOK。サンプルプログラムとしてこんなのを書いて、
using System;
using System.Numerics;
using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Complex;
namespace MatrixTest001
{
class Program
{
static void Main(string[] args)
{
var A = Matrix.Build.DenseOfArray(new Complex[,]
{
{ 2.0, 1.0, 1.0},
{ -1.0, 1.0, -1.0},
{ 1.0, 2.0, 3.0}
}
);
var b = MathNet.Numerics.LinearAlgebra.Vector.Build.DenseOfArray(new Complex[]
{2.0, 3.0, -10.0});
var x = A.Solve(b);
Console.WriteLine(x);
Console.WriteLine(A.Inverse());
Console.WriteLine(A.Determinant());
}
}
}
実行すると、
と想定している結果が得られた。
ここで複素数は(x,y)のような形で表示される。
ということで基本の基本はだいたいわかったので、ちょっといろいろやってみる(続く)。
« 松のやでレモン風味のねぎ塩ロースかつ定食をいただく。ものすごくさっぱりしている。梅肉もついてさらにさっぱり。 | トップページ | すき家でダブル以上のトリプルニンニク牛丼特盛(ニンニクの芽、フライドにんにく、ガリガリファイヤー)をいただく。これはニンニク三昧! »
「パソコン・インターネット」カテゴリの記事
- 出遅れましたがFizzBuzzをExcelのMAP,LAMBDA,SEQUENCE,IFS関数を使って一行(というかただの1セル入力)で作る。(2023.09.24)
- iOS17の新機能、Object CaptureをアプリHyper Captureで試す。ゴッホのスヌーピーとフェルメールの牛乳を注ぐミッフィーを3D スキャンでぐるぐる回す。3回角度変えてキャプチャが必要だった。プロセスはiPhone 12 Pro Maxなんで時間掛かるけどかなり綺麗に。(2023.09.21)
- 離散リアプノフ方程式 AXAᴴ - X + Q = 0がクロネッカー積とvecで計算できることを思い出した!(Vec Trickというそう)。Pythonのscipy.linalg.solve_discrete_lyapunovとnumpy.kronの両方で計算してちゃんと合うことを確認。(2023.09.22)
- Google検索の生成AI,SGEが使えるようになっていた。じゃあということでRIS(Reconfigurable Intelligent Surface)について聞いてみた。ChatGPT, BingのAIチャット、Bardと比較。ZTEが先日発表していたので聞いたが、SGEはその話にも触れた。詳しいのはChatGPTだった。(2023.09.02)
- PythonのmatplotlibにXKCD(棒人間の理系コミック、ホワット・イフのランドール・マンローさん作)の手書き風グラフが描ける機能があった!せっかくなのでルンゲクッタ法のDormand Prince8次(DOP853)でローレンツ方程式を描く。(2023.09.01)
「学問・資格」カテゴリの記事
- 浜村渚の計算ノート 10さつめ ラ・ラ・ラ・ラマヌジャンを読んだ。九章算術、ベクトル、四元数、電卓、そしてラマヌジャン!タクシー数も1+2+3+…=-1/12もいろんな公式も出てきます。カプレカー数も。高精度計算サイトkeisan.casio.jpにUPしているものとも関連していてよかった。(2023.09.26)
- 出遅れましたがFizzBuzzをExcelのMAP,LAMBDA,SEQUENCE,IFS関数を使って一行(というかただの1セル入力)で作る。(2023.09.24)
- (速報続報)iPhone15 Proが早くも分解。USモデルなのでミリ波アンテナ3つが見えてる。USモデルとその他でMLBの形から違う!(USはeSIM、他はSIMカード)、なのでスペースがなくて他モデルはミリ波アンテナ部分に部品乗せてる!(2023.09.23)
- 離散リアプノフ方程式 AXAᴴ - X + Q = 0がクロネッカー積とvecで計算できることを思い出した!(Vec Trickというそう)。Pythonのscipy.linalg.solve_discrete_lyapunovとnumpy.kronの両方で計算してちゃんと合うことを確認。(2023.09.22)
- 高周波(RF・マイクロ波・ミリ波・5G)関連ニュース2023年9月19日 Microwave Magazineの特集はRFIDや氷を検出する話、Microwave Journalで車載アンテナ評価でRanLOSというのを初めて知る、Gapwavesの多層導波管、PythonのRFライブラリScikit-RFに高木分解を使うTUG multiline TRLが。(2023.09.19)
「日記・コラム・つぶやき」カテゴリの記事
- 浜村渚の計算ノート 10さつめ ラ・ラ・ラ・ラマヌジャンを読んだ。九章算術、ベクトル、四元数、電卓、そしてラマヌジャン!タクシー数も1+2+3+…=-1/12もいろんな公式も出てきます。カプレカー数も。高精度計算サイトkeisan.casio.jpにUPしているものとも関連していてよかった。(2023.09.26)
- 出遅れましたがFizzBuzzをExcelのMAP,LAMBDA,SEQUENCE,IFS関数を使って一行(というかただの1セル入力)で作る。(2023.09.24)
- (速報続報)iPhone15 Proが早くも分解。USモデルなのでミリ波アンテナ3つが見えてる。USモデルとその他でMLBの形から違う!(USはeSIM、他はSIMカード)、なのでスペースがなくて他モデルはミリ波アンテナ部分に部品乗せてる!(2023.09.23)
- iOS17の新機能、Object CaptureをアプリHyper Captureで試す。ゴッホのスヌーピーとフェルメールの牛乳を注ぐミッフィーを3D スキャンでぐるぐる回す。3回角度変えてキャプチャが必要だった。プロセスはiPhone 12 Pro Maxなんで時間掛かるけどかなり綺麗に。(2023.09.21)
- 離散リアプノフ方程式 AXAᴴ - X + Q = 0がクロネッカー積とvecで計算できることを思い出した!(Vec Trickというそう)。Pythonのscipy.linalg.solve_discrete_lyapunovとnumpy.kronの両方で計算してちゃんと合うことを確認。(2023.09.22)
« 松のやでレモン風味のねぎ塩ロースかつ定食をいただく。ものすごくさっぱりしている。梅肉もついてさらにさっぱり。 | トップページ | すき家でダブル以上のトリプルニンニク牛丼特盛(ニンニクの芽、フライドにんにく、ガリガリファイヤー)をいただく。これはニンニク三昧! »
コメント