RcppArmadilloを使用して完全なピボットを使用してLU分解を実装しようとしています。幸いにも私はthisのMatlabコードを持っていますが、私はArmadilloに変換するいくつかの課題を抱えています。 RcppArmadilloで入力を変更する
私はあなたの入力L、U、およびP、およびarma::LU
関数はL、UおよびP.
を返すのではなく、入力されたL、U、およびP行列を修正
arma::LU
ように私の
gecpLU
機能の仕事を作りたかったです
は、私は定期的にRcpp
とあなたがそうのように簡単に入力を変更することができることを知っている:
NumericVector example(NumericVector X) {
X = 2 * X;
return X;
}
これは、ベクトルを2回入力を返す、とも等しい2倍元の値に入力を変更します。しかし、私はすぐにこれがRcppArmadilloではうまくいかないことを発見しました。
私はRにさらされたときに、あなたが直接Rオブジェクトを変更することはできませんのでarma
オブジェクトはRのオブジェクトのコピーであるため、これは、入力を変更しません理解し、私はまだする必要がありますように私は感じ
arma::colvec example(arma::colvec X) {
X = 2 * X;
return X;
}
そのようアルマジロのLUのような関数を書くことができる:
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
int gecpLU(arma::mat L, arma::mat U, arma::mat P, arma::mat Q, arma::mat A) {
// Take A and overwrite LUPQ such that A=P*L*U*Q
int n=A.n_rows;
P.eye(n,n);
Q.eye(n,n);
arma::mat AA=A;
// for (int i=0;i<(n-1);i++) {
// delete a whole bunch of stuff not relevant to question
// }
L.eye(n,n);
arma::mat tempmat=arma::trimatl(AA);
tempmat.diag()*=0;
L=L-tempmat;
U=arma::trimatu(AA);
return 0;
}
// [[Rcpp::export]]
List test(arma::mat A) {
arma::mat L1,U1,P1,L2,U2,P2,Q;
arma::lu(L1,U1,P1,A);
gecpLU(L2,U2,P2,Q,A);
return List::create(_["L1"]=L1,
_["U1"]=U1,
_["P1"]=P1,
_["L2"]=L2,
_["U2"]=U2,
_["P2"]=P2,
_["Q"]=Q);
}
この場合、私は私のgecpLU
関数にR行列を渡していないのですが、arma::mat
ので、入力を変更することができるはずです。
私がtest
を実行すると、L1、U1、P1の行列が得られますが、L2、U2、P2、Qの行列は0x0です。私は何かを誤解しているように感じます。 RcppArmadilloで入力を変更することは可能ですか?そうでない場合、4つの行列を出力する最良の方法は何ですか?リスト?アンダー
最も簡単な方法は、中に転送することである(すなわち、末尾にオブジェクトを破棄)コピーを通過Rcppベクタを生成し、補助コンストラクタを使用して 'arma'オブジェクトを作成します(詳細はhttp://arma.sourceforge.net/docs.html#Colの' Advanced constructors'セクションを参照してください)。 –