Aを対称行列とし、vをベクトルとする。私はこのC++固有作成コピー?
a = MatrixXd(A.middleCols(j,n).selfadjointView<Lower>()) * v
がないのに対し、私は第二のバージョンが行うかどうかを疑問に思って、Jから始まるn列のブロックから抽出し、コンパイルされないこのよう
VectorXd a;
a = A.middleCols(j,n).selfadjointView<Lower>() * v // does not compile
を用いて、Vを掛け
A.middleCols(j,n).selfadjointView<Lower>()
または直接計算を実行しますか?
ありがとうございます。
EDIT:私はエラーを取得するなどの問題が、引数の型とは何かを持っている疑いがある:
invalid argument type 'typename ConstSelfAdjointViewReturnType.... to unary expression'
実際、Aは
のいずれかを使用して、const参照で渡された関数の引数でありますここconst MatrixXd& A
const Ref<const MatrixXd>& A
例である:
// this version doesn't compile
MatrixXd returnSymmetricMatrix(const MatrixXd& A, const VectorXd& v, const MatrixXd& B){
// B is a symmetric matrix
VectorXd a;
a = A.middleCols(3, 4).selfadjointView<Lower>() * v;
MatrixXd M(code_fill(){...});
// code_fill is the function filling the lower triangular part of a symmetric matrix
M.block(1, 2, 3, 4).triangularView<Lower>() += B.selfadjointView<Lower>();
return M;
}
// this version compiles
MatrixXd returnSymmetricMatrix(const MatrixXd& A, const VectorXd& v, const MatrixXd& B){
// B is a symmetric matrix
VectorXd a;
a = MatrixXd(A.middleCols(3, 4).selfadjointView<Lower>()) * v;
MatrixXd M(code_fill(){...});
// code_fill is the function filling the lower triangular part of a symmetric matrix
Matrix(M.block(1, 2, 3, 4).triangularView<Lower>()) += B.selfadjointView<Lower>();
return M;
}
EDIT2私の最初の質問と私が編集セクションで追加した例については、私はコピーについて少し混乱しています。そのLHSそのM.block(1、2、3、4).triangularView()が実際に固有に伝えるので、私は作業と非稼働バージョン、ライン
Matrix(M.block(1, 2, 3, 4).triangularView<Lower>()) += B.selfadjointView<Lower>();
作品の違いを理解するように行列への参照ではなく行列である。さもなければ、演算子+ =は、この演算子が.block()に対して多重定義されていないというエラーによって発生します。ですから、私の元来の質問は、Matrix(...)は計算を有効にするためにMatrixであることを伝えるのか、それとも...をMatrixにコピーするのかということだけです。ありがとう!
私のために、式はコンパイル(および実行)されます。追加の情報を確認して追加することができますか? –
はい、最初のものはうまくいくはずです。私は 'A'の代わりに' M'を使っているのを見ています... – ggael
[MCVE]に肉付けできますか? –