_Array _Vector VectorDenseInt _VectorDouble VectorDenseDouble VectorSparseDouble _VectorComplex VectorDenseComplex VectorSparseComplex _Matrix _MatrixDouble _MatrixGeneralDouble MatrixDenseGeneralDouble MatrixDenseBandDouble MatrixSparseGeneralDouble _MatrixSquareDouble MatrixDenseUpperTriangleDouble MatrixDenseLowerTriangleDouble MatrixDenseSymmetricDouble MatrixSparseUpperTriangleDouble MatrixSparseLowerTriangleDouble MatrixSparseSymmetricDouble _MatriComplex _MatrixGeneralComplex MatrixDenseGeneralComplex MatrixDenseBandComplex MatrixSparseGeneralComplex _MatrixSquareComplex MatrixDenseUpperTriangleComplex MatrixDenseLowerTriangleComplex MatrixDenseSymmetricComplex MatrixDenseHermite MatrixSparseUpperTriangleComplex MatrixSparseLowerTriangleComplex MatrixSparseSymmetricComplex MatrixSparseHermite
e = A*x - b
は行列 A が何であれ、このように
書くことができるし、配列要素 A[i,j] にアクセスするには v = A[i,j]
と書くだけです。
Mol ではこのようなデータ構造の違いをプログラマーから隠蔽、全ての行列やベクトル同士の演算(四則演算 + - * / )に対応しています。
さらに、構造保持のため、以下のように制約が強制されます。
A[i,j] = v
は A[j,i] = v
と同じ(A[i,j]とA[j,i]のメモリアドレスは同じ)です。
A[i,j]
にアクセスする場合は .Net(Mol.Net.Dll)と従来のDLL(Mol.C++.Dll)間の
データ交換操作が実行されますが、比較的コストの高い処理です。
以下のような頻繁に行列やベクトル要素にアクセスすることは避けて、簡単に C = A*B;
等と記述して、
計算は Mol.C++.Dll 内(.Net の外側)で行うようにしてください。
int N = 1000;
MatrixDenseGeneralDouble A = new MatrixDenseGeneralDouble(N,N);
MatrixDenseSymmetricDouble B = new MatrixDenseSymmetricDouble(N);
...........
MatrixDenseGeneralDouble C = A*B; // 計算は Mol.C++.Dll 内(.Net の外側)で実行される。
// 結果は同じでも、以下のような書き方は避けること。
// for(int i=1;i<=N;++i)
// {
// for(int j=0;j<=N;++j)
// {
// double s = 0;
// for(int k=1;k<=N;++k) s += A[i,k]*B[k,j]; // 掛け算は .Net 環境で実行される。
// C[i,j] = s;
// }
// }
この様な四則演算子 + - * / 等を使う方法よりさらに高速・効率的な _Blas や _VML のメソッド群も
用意されています。
呼出し形式 | 説明 | 備考 |
---|---|---|
Complex A[int I] | 一次元配列 I 番目の要素にアクセスします。 | 子クラスで再定義されるので ((_Array)A)[I] とキャストしてください。 |
int A.SizeLimit | 一次元配列の最大値。密な配列では以下の Size や Count は SizeLimit と同じ値になります。 | 読み込みのみ |
int A.Size | 現時点で確保されている一次元配列のサイズ(Size ≦ SizeLimit)。 | 読み込みのみ。 |
int A.Count | 現時点で値の設定されている要素の数(Count ≦ Size)。 | 読み込みのみ。 |
A.Negate() void _Array.Negate(A) | A の全要素の符号を反転します。 | |
int A.Fill(Complex v) int _Array.Fill(A,Complex v) | A の全要素に値 v を代入します。 | 戻り値は A.Count |
int _Array.CopyN(_Array target, int ix_t, _Array source, int ix_s, int N) | source[ix_s]から N 個の要素を target[ix_t] の位置からコピーします。 | どちらかの配列サイズを超えない範囲で実行されます。戻り値はコピーした要素数 |
void A.SetConjugated() void _Array.SetConjugated(A) | A の全要素を複素共役で置き換えます。 | 複素数配列のみ有効 |
double A.MaxAbs() double _Array.MaxAbs(A) | Aの最大絶体値を返します。 | |
double A.SumSquare() double _Array.SumSquare(A) | Aの全要素の二乗和を返します。 | |
double A.SumAbs() double _Array.SumAbs(A) | Aの全要素の絶対値の和を返します。 | |
ARRAY_TYPE ArrayType() ARRAY_TYPE Complex ArrayType(A) | Aの配列タイプを返します。 |
呼出し形式 | 説明 |
---|---|
c = _Array.Add(c,a,b) | c[i]=a[i]+b |
c = _Array.Add(c,b,a) | c[i]=b+a[i] |
c = _Array.Sub(c,a,b) | c[i]=a[i]-b |
c = _Array.Sub(c,b,a) | c[i]=b-a[i] |
c = _Array.Mul(c,a,b) | c[i]=a[i]*b |
c = _Array.Mul(c,b,a) | c[i]=b*a[i] |
c = _Array.Div(c,a,b) | c[i]=a[i]/b |
c = _Array.Div(c,b,a) | c[i]=b/a[i] |