Rcpp 函数总是 returns 零矩阵
Rcpp function always returns the zero matrix
我编写了一个 Rcpp 函数来计算矩阵列之间的余弦相似度:
#include <Rcpp.h>
using namespace Rcpp;
// Below is a simple example of exporting a C++ function to R. You can
// source this function into an R session using the Rcpp::sourceCpp
// function (or via the Source button on the editor toolbar)
// For more on using Rcpp click the Help button on the editor toolbar
// [[Rcpp::export]]
NumericMatrix mysimil(NumericMatrix X, NumericVector norms) {
int nrow = X.nrow(), ncol = X.ncol();
NumericMatrix out(nrow, ncol);
for (int i = 0; i < nrow; i++) {
for (int j = i+1; j < ncol; j++) {
out(i,j) <- sum(X(_,i)*X(_,j))/(norms[i]*norms[j]);
out(j,i) <- out(i,j);
}
}
return out;
}
调用函数时,norms 参数将包含每一列的范数。然而,输出始终是零矩阵。有人能告诉我这里出了什么问题吗?
编译代码时sourceCpp
returns的警告(即warning: value computed is not used [-Wunused-value]
)提示赋值有问题。
确实,在为 out
赋值时,您使用的是 R 赋值运算符 <-
,而不是 C/C++ 运算符 =
。您的 <-
仍然是有效的 C++ 代码并被视为不等式(x <- y
等同于 x < -y
)。在这种情况下,您的表达式要求:
是否out(i,j)
小于-sum(X(_,i) * X(_,j)) / (norms[i]*norms[j])
?
更正运算符并正确分配值。
我编写了一个 Rcpp 函数来计算矩阵列之间的余弦相似度:
#include <Rcpp.h>
using namespace Rcpp;
// Below is a simple example of exporting a C++ function to R. You can
// source this function into an R session using the Rcpp::sourceCpp
// function (or via the Source button on the editor toolbar)
// For more on using Rcpp click the Help button on the editor toolbar
// [[Rcpp::export]]
NumericMatrix mysimil(NumericMatrix X, NumericVector norms) {
int nrow = X.nrow(), ncol = X.ncol();
NumericMatrix out(nrow, ncol);
for (int i = 0; i < nrow; i++) {
for (int j = i+1; j < ncol; j++) {
out(i,j) <- sum(X(_,i)*X(_,j))/(norms[i]*norms[j]);
out(j,i) <- out(i,j);
}
}
return out;
}
调用函数时,norms 参数将包含每一列的范数。然而,输出始终是零矩阵。有人能告诉我这里出了什么问题吗?
编译代码时sourceCpp
returns的警告(即warning: value computed is not used [-Wunused-value]
)提示赋值有问题。
确实,在为 out
赋值时,您使用的是 R 赋值运算符 <-
,而不是 C/C++ 运算符 =
。您的 <-
仍然是有效的 C++ 代码并被视为不等式(x <- y
等同于 x < -y
)。在这种情况下,您的表达式要求:
是否out(i,j)
小于-sum(X(_,i) * X(_,j)) / (norms[i]*norms[j])
?
更正运算符并正确分配值。