20

Rcppを試すのはこれが初めてで、この非常に単純な問題が問題を引き起こしています。ネストされたforループを使用して、一度に1列ずつ行列の個々の値を操作したいと思います。私が目指しているスクリプトは次のようになります。

src <- '
    Rcpp::NumericMatrix Am(A);
    int nrows = Am.nrow();
    int ncolumns = Am.ncol();
    for (int i = 0; i < ncolumns; i++){
        for (int j = 1; j < nrows; j++){
            Am[j,i] = Am[j,i] + Am[j-1,i];
        }
    }
    return Am;
'
fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp")
fun(matrix(1,4,4))

必要な出力は次のようになります。

     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4

問題は明らかにこの行にあり、行列の個々の要素を参照する方法がわかりません。

Am[j,i] = Am[j,i] + Am[j-1,i];

これが愚かな初心者の質問である場合はお詫び申し上げます。ヒントをいただければ幸いです。

4

1 に答える 1

30

1 つの式で複数のインデックスを使用することはできません。これは、私が知っている C++ 行列クラス システムまたはライブラリが克服できない[ ]C 言語の制限です。代わりに使用してください。( )

srcそれと、実際にに渡さなかった間違いを修正すると、次のcxxfunction()ようになります。

R> src <- '
+     Rcpp::NumericMatrix Am(A);
+     int nrows = Am.nrow();
+     int ncolumns = Am.ncol();
+     for (int i = 0; i < ncolumns; i++) {
+         for (int j = 1; j < nrows; j++) {
+             Am(j,i) = Am(j,i) + Am(j-1,i);
+         }
+     }
+     return Am;
+ '
R> fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp")
R> fun(matrix(1,4,4))
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4
R> 

最後に、Rcpp sugar には一度に行全体または列全体を操作する例があることに注意してください。メーリング リストのアーカイブとビネットを参照してください。

編集:明確にするために、 1 つのループと Rcpp シュガーの列単位のインデックス付けを使用した同じ

R> src <- '
+     Rcpp::NumericMatrix Am(A);
+     int nrows = Am.nrow();
+     for (int j = 1; j < nrows; j++) {
+         Am(j,_) = Am(j,_) + Am(j-1,_);
+     }
+     return Am;
+ '
R> fun <- cxxfunction(signature(A = "numeric"), body = src, plugin="Rcpp")
R> fun(matrix(1,4,4))
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4
R> 
于 2011-05-08T23:44:51.753 に答える