在我的实现中,我经常处理子矩阵和矩阵块。我想知道Armadillo中是否有一种方法可以让我提取一个更大矩阵的块,并为此子矩阵使用与原始矩阵内的块相同的内存。我的问题是我不知道该怎么做,因为原始矩阵中的位置不连续。
这是一个简单的示例,它说明了当我的原始矩阵为A = [A1 A2]
时我想做什么:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat foo(arma::mat A, arma::uword block_start, arma::uword block_length) {
arma::uword rows = A.n_rows;
arma::mat B = arma::mat(A.begin_col(block_start), rows, block_length, false);
// fill B here for illustration;
// in the real piece of code I do various manipulations, multiplications, etc using B
B.fill(1.0);
return A;
}
/*** R
A <- matrix(0, 4, 4)
foo(A, 0, 2)
> A <- matrix(0, 4, 4)
> foo(A, 0, 2)
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 1 0 0
[3,] 1 1 0 0
[4,] 1 1 0 0
*/
在这种情况下,子矩阵的位置是连续的,我可以使用高级构造函数来链接内存。
现在假设我希望子矩阵为A[1:2, 1:2]
。我可以在Armadillo中获得副本B
,该副本使用与A
中原始元素相同的内存吗? (理想情况下,此问题的解决方案还可以推广到列也不连续的情况下,例如A[c(1, 3), c(1, 3)]
。)
编辑:为明确起见,我确实需要上述函数中的矩阵B
单独存在。我没有在我的真实代码中fill
,而是在各种矩阵乘法等中使用它(以及多个其他子矩阵)。所以我所追求的是一种将B
创建为非A
的连续子矩阵,同时确保它们使用相同的内存。
答案 0 :(得分:0)
您可以使用submatrix views写入连续或非连续内存:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat foo(arma::mat A) {
A.submat(0, 0, 1, 1).fill(1.0);
return A;
}
// [[Rcpp::export]]
arma::mat bar(arma::mat A) {
arma::uvec rows;
rows << 0 << 2;
arma::uvec cols;
cols << 0 << 2;
A.submat(rows, cols).fill(2.0);
return A;
}
/*** R
A <- matrix(0, 4, 4)
foo(A)
bar(A)
*/
输出:
> A <- matrix(0, 4, 4)
> foo(A)
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 1 0 0
[3,] 0 0 0 0
[4,] 0 0 0 0
> bar(A)
[,1] [,2] [,3] [,4]
[1,] 2 0 2 0
[2,] 0 0 0 0
[3,] 2 0 2 0
[4,] 0 0 0 0