在 Rcpp 中操作 NumericMatrix
Manipulating NumericMatrix in Rcpp
我是 Rcpp 的新手。我已阅读 Advanced R by Hadley Wickham 和所有 Rcpp 小插图,但我不知道如何操作 NumericMatrix
对象。
有没有什么简单的方法可以做到像这个R
代码
mat <- matrix(1:9,3,3)
v <- matrix(2,2,2)
mat[1,] <- NA
mat[,3] <- 0.5
mat[2:3,2:3] <- v
除了在行和列上循环并设置每个值 mat[i,j]
?
Edit3:好的,我们再试一次。
这是我的 cpp 文件:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix lissage_incapC(NumericMatrix mat) {
// INIT
NumericMatrix x(mat.nrow()+1,mat.ncol()+1);
NumericMatrix out(mat.nrow(),mat.ncol());
// Here i want to set x first row and first column to NA_REAL //**1
for(int i=0; i<x.nrow(); i++){
for(int j=0; j<x.ncol(); j++){
if(i==0 || j==0)
x(i,j) = NA_REAL;
x(i,j) = mat(i-1,j-1);
}
}
for(int i=8; i<x.nrow()-1; i++){
for(int j=1; j<x.ncol()-1; j++){
NumericMatrix y = x(Range(i-1,i+1),Range(j-1,j+1));
y(1,1) = NA_REAL;
if((i == 8) & (j>1))
y.row(0) = NumericVector::get_na(); //problem here
out(i,j-1) = 1/2*x(i,j) + 1/2 * mean(na_omit(y));
}
}
out(_,out.ncol()) = 0.5; // Problem here
out(Range(0,7),_) = out(8,_); // Problem here
return out;
}
我已经在评论中指出了我的问题。在第一个 (//**1) 中,我必须编写两个循环来设置第一行和第一列。
我要问的是:有没有更简单的方法来做到这一点,就像我们可以在 R 中做的那样?
这与我在代码注释中指出的问题相同。
从技术上讲是的,虽然它只是一个糖 IIRC。
这是一个简短的演示:
library(inline)
src <- '
Rcpp::NumericMatrix Am(A);
NumericVector na_vec(Am.ncol(), NA_REAL);
Am(0, _) = na_vec;
Am(_, 0) = na_vec;
return Am;
'
f <- cxxfunction(signature(A = "numeric"), body = src, plugin = "Rcpp")
f(matrix(1, 3, 3))
# [,1] [,2] [,3]
#[1,] NA NA NA
#[2,] NA 1 1
#[3,] NA 1 1
我是 Rcpp 的新手。我已阅读 Advanced R by Hadley Wickham 和所有 Rcpp 小插图,但我不知道如何操作 NumericMatrix
对象。
有没有什么简单的方法可以做到像这个R
代码
mat <- matrix(1:9,3,3)
v <- matrix(2,2,2)
mat[1,] <- NA
mat[,3] <- 0.5
mat[2:3,2:3] <- v
除了在行和列上循环并设置每个值 mat[i,j]
?
Edit3:好的,我们再试一次。
这是我的 cpp 文件:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix lissage_incapC(NumericMatrix mat) {
// INIT
NumericMatrix x(mat.nrow()+1,mat.ncol()+1);
NumericMatrix out(mat.nrow(),mat.ncol());
// Here i want to set x first row and first column to NA_REAL //**1
for(int i=0; i<x.nrow(); i++){
for(int j=0; j<x.ncol(); j++){
if(i==0 || j==0)
x(i,j) = NA_REAL;
x(i,j) = mat(i-1,j-1);
}
}
for(int i=8; i<x.nrow()-1; i++){
for(int j=1; j<x.ncol()-1; j++){
NumericMatrix y = x(Range(i-1,i+1),Range(j-1,j+1));
y(1,1) = NA_REAL;
if((i == 8) & (j>1))
y.row(0) = NumericVector::get_na(); //problem here
out(i,j-1) = 1/2*x(i,j) + 1/2 * mean(na_omit(y));
}
}
out(_,out.ncol()) = 0.5; // Problem here
out(Range(0,7),_) = out(8,_); // Problem here
return out;
}
我已经在评论中指出了我的问题。在第一个 (//**1) 中,我必须编写两个循环来设置第一行和第一列。 我要问的是:有没有更简单的方法来做到这一点,就像我们可以在 R 中做的那样?
这与我在代码注释中指出的问题相同。
从技术上讲是的,虽然它只是一个糖 IIRC。 这是一个简短的演示:
library(inline)
src <- '
Rcpp::NumericMatrix Am(A);
NumericVector na_vec(Am.ncol(), NA_REAL);
Am(0, _) = na_vec;
Am(_, 0) = na_vec;
return Am;
'
f <- cxxfunction(signature(A = "numeric"), body = src, plugin = "Rcpp")
f(matrix(1, 3, 3))
# [,1] [,2] [,3]
#[1,] NA NA NA
#[2,] NA 1 1
#[3,] NA 1 1