LAPACK への C++ インターフェイスを作成しましたが、メモリの問題が発生したため、演算子のオーバーロードを再考する必要がありました。
現在、2 つの Matrix オブジェクトを取り、適切な次元で 3 番目のオブジェクトを割り当て、D(GE/SY)MM を使用してproduct (新しく割り当てられた行列の内部ストレージに格納) し、その新しい行列へのポインタを返します。IE
class Matrix {
...
friend Matrix* operator*(const Matrix&, const Matrix&);
...
}
Matrix* operator*(const Matrix& m1, const Matrix& m2) {
Matrix *prod = new Matrix(m1.rows_, m2.cols_);
if(m1.cols_!=m2.rows_) {
throw 3008;
} else {
double alpha = 1.0;
double beta = 0.0;
if(m1.symm_=='G' && m2.symm_=='G'){
dgemm_(&m1.trans_,&m2.trans_,&m1.rows_,&m2.cols_,&m1.cols_,&alpha,m1.data_,
&m1.rows_,m2.data_,&m1.cols_,&beta,prod->data_,&m2.cols_);
} else if(m1.symm_=='S'){
char SIDE = 'L';
char UPLO = 'L';
dsymm_(&SIDE,&UPLO,&m1.rows_,&m2.cols_,&alpha,m1.data_,&m1.rows_,m2.data_,
&m2.cols_,&beta,prod->data_,&m2.cols_);
} else if(m2.symm_=='S'){
char SIDE = 'R';
char UPLO = 'L';
dsymm_(&SIDE,&UPLO,&m2.rows_,&m1.cols_,&alpha,m2.data_,&m2.rows_,m1.data_,
&m1.cols_,&beta,prod->data_,&m1.cols_);
};
}
return prod;
};
それから私は利用します
Matrix *A, *B, *C;
// def of A and B
C = (*A)*(*B);
そして、これはうまく機能します。私が抱えている問題は、これを行うたびに新しい行列を割り当てなければならないことです。私ができるようにしたいのは、C
行列を一度割り当てて、 と の積A
を( )B
の内部ストレージに配置することです。演算子のオーバーロードで見つけたものから、これを行う良い方法が見つかりません。これを行うためにメンバー関数を使用できることは承知していますが(つまり)、可能であればそれを避けたいと思います(非CSEタイプの開発を容易にするためにこれをコーディングしています)。どんなアイデアでも大歓迎です。C
C->data_
C->mult(A,B)