如何在 Armadillo 中按元素划分 2 个稀疏矩阵?
How to element-wise divide 2 sparse matrices in Armadillo?
我是 C++ 的新手,但我正在使用 R 和 RcppArmadillo,我的目标是按元素划分 2 个稀疏矩阵。我在 Armadillo 的文档中读到运算符是 /
但是当我使用 sourceCpp
源我的代码时我收到这个错误:
no match for 'operator/' (operand types are 'arma::sp_mat' {aka 'arma::SpMat'} and 'arma::sp_mat' {aka 'arma::SpMat'})
我写了一个小代码示例。请注意,当我从脚本中删除除法函数时,乘法函数可以正常工作。
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
//' Sparse Matrix element-wise multiplication
//'
//' @param X sp_mat
// [[Rcpp::export]]
arma::sp_mat sp_mat_mul(arma::sp_mat X){
arma::sp_mat Y = X % X;
return Y;
}
//' Sparse Matrix element-wise division
//'
//' @param X sp_mat
// [[Rcpp::export]]
arma::sp_mat sp_mat_div(arma::sp_mat X){
arma::sp_mat Y = X / X;
return Y;
}
感谢您的宝贵时间,非常感谢!
使用transform/foreach计算倒数然后相乘。
//' Sparse Matrix element-wise division
//'
//' @param X sp_mat
// [[Rcpp::export]]
arma::sp_mat sp_mat_div(arma::sp_mat X){
arma::sp_mat x_inverse(X);
x_inverse.transform([](double val) {return (1.0/val);});
arma::sp_mat Y = X % x_inverse;
return Y;
}
R:
i <- c(1,3:8)
j <- c(2,9,6:10)
x <- 7 * (1:7)
A <- sparseMatrix(i, j, x = x)
sp_mat_div(A)
[1,] . 1 . . . . . . . .
[2,] . . . . . . . . . .
[3,] . . . . . . . . 1 .
[4,] . . . . . 1 . . . .
[5,] . . . . . . 1 . . .
[6,] . . . . . . . 1 . .
[7,] . . . . . . . . 1 .
[8,] . . . . . . . . . 1
顺便说一句,你确定这个操作有意义吗?
你忽略了矩阵中的所有零(因为它是稀疏的),如果这是一个非稀疏矩阵,你会被零除很多。
我是 C++ 的新手,但我正在使用 R 和 RcppArmadillo,我的目标是按元素划分 2 个稀疏矩阵。我在 Armadillo 的文档中读到运算符是 /
但是当我使用 sourceCpp
源我的代码时我收到这个错误:
no match for 'operator/' (operand types are 'arma::sp_mat' {aka 'arma::SpMat'} and 'arma::sp_mat' {aka 'arma::SpMat'})
我写了一个小代码示例。请注意,当我从脚本中删除除法函数时,乘法函数可以正常工作。
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
//' Sparse Matrix element-wise multiplication
//'
//' @param X sp_mat
// [[Rcpp::export]]
arma::sp_mat sp_mat_mul(arma::sp_mat X){
arma::sp_mat Y = X % X;
return Y;
}
//' Sparse Matrix element-wise division
//'
//' @param X sp_mat
// [[Rcpp::export]]
arma::sp_mat sp_mat_div(arma::sp_mat X){
arma::sp_mat Y = X / X;
return Y;
}
感谢您的宝贵时间,非常感谢!
使用transform/foreach计算倒数然后相乘。
//' Sparse Matrix element-wise division
//'
//' @param X sp_mat
// [[Rcpp::export]]
arma::sp_mat sp_mat_div(arma::sp_mat X){
arma::sp_mat x_inverse(X);
x_inverse.transform([](double val) {return (1.0/val);});
arma::sp_mat Y = X % x_inverse;
return Y;
}
R:
i <- c(1,3:8)
j <- c(2,9,6:10)
x <- 7 * (1:7)
A <- sparseMatrix(i, j, x = x)
sp_mat_div(A)
[1,] . 1 . . . . . . . .
[2,] . . . . . . . . . .
[3,] . . . . . . . . 1 .
[4,] . . . . . 1 . . . .
[5,] . . . . . . 1 . . .
[6,] . . . . . . . 1 . .
[7,] . . . . . . . . 1 .
[8,] . . . . . . . . . 1
顺便说一句,你确定这个操作有意义吗?
你忽略了矩阵中的所有零(因为它是稀疏的),如果这是一个非稀疏矩阵,你会被零除很多。