R 非连续矩阵的高级构造函数

R 非连续矩阵的高级构造函数,r,rcpp,armadillo,rcpparmadillo,R,Rcpp,Armadillo,Rcpparmadillo,在我的实现中,我经常使用子矩阵和矩阵块。我想知道犰狳中是否有一种方法可以让我从一个较大的矩阵中提取一个块,并对这个子矩阵使用与原始矩阵中的块相同的内存。我的问题是,我不知道如何处理这个问题,因为原始矩阵中的位置是不连续的 这里有一个简单的例子,说明了当我的原始矩阵是A=[a1a2]时我想做什么: #include <RcppArmadillo.h> // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] arma::mat fo

在我的实现中,我经常使用子矩阵和矩阵块。我想知道犰狳中是否有一种方法可以让我从一个较大的矩阵中提取一个块,并对这个子矩阵使用与原始矩阵中的块相同的内存。我的问题是,我不知道如何处理这个问题,因为原始矩阵中的位置是不连续的

这里有一个简单的例子,说明了当我的原始矩阵是
A=[a1a2]
时我想做什么:

#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
*/
#包括
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
arma::mat foo(arma::mat A,arma::uword块开始,arma::uword块长度){
arma::uword行=A.n_行;
arma::mat B=arma::mat(A.begin\u col(block\u start),行,block\u长度,false);
//在此处填写B以进行说明;
//在真实的代码中,我使用B语言进行各种操作、乘法等
B.填充(1.0);
返回A;
}
/***R
阿福(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]
。我可以在犰狳中获得一个副本
B
,它使用与
a
中原始元素相同的内存吗?(理想情况下,这个问题的解决方案也可以推广到列也不连续的情况,例如
a[c(1,3),c(1,3)]

编辑:为了澄清,我确实需要上述函数中的矩阵
B
独立存在。我不会在我的真实代码中填充它,而是在各种矩阵乘法中使用它(以及多个子矩阵)。因此,我想要的是一种方法,将
B
创建为
a
的非连续子矩阵,同时确保它们使用相同的内存。

您可以使用写入连续或非连续内存:

#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)
*/
#包括
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
arma::mat foo(arma::mat A){
A.submat(0,0,1,1)。填充(1.0);
返回A;
}
//[[Rcpp::导出]]
arma::mat bar(arma::mat A){
arma::uvec行;

行,谢谢,拉尔夫。这些子矩阵视图是我一直在使用的,但也许我做了一个太小的示例误导了你。我使用提取的子矩阵进行各种矩阵计算,所以
fill
只是在我的示例中做些事情。所以我确实需要子矩阵作为自己的对象存在,我要的是使用我的子矩阵的内存与大矩阵中的原始元素的内存相同。抱歉,如果我不清楚,我将更新我的帖子以澄清。我想你想要一个圆孔中的方形钉。想想5x5矩阵。现在你想要内部3x3…但你不能在没有副本的情况下连续使用,因为外部矩阵的大小决定了25个单元格的大小在5x5中使用了。@DirkEddelbuettel你可能是对的。但这都是关于指针的,不是吗?所有东西都可以被指向。理想情况下,人们可以使用
submat(行,列)。begin()
但这不起作用。当然,这可能会很难销售,因为你有一个更复杂的依赖关系。我觉得一次又一次地提取和复制子矩阵有点脏,所以避免这样做太好了。嗯,我担心你只是在重复你想要的,而忽略了内存的使用。从记事本开始d“抽签”一个5x5矩阵。勾勒出第一个、第二个、第20个地址是什么。然后尝试找到一个多行/多列子视图,并说服自己它不可能是一个连续的子向量。我可能错了,但我仍然认为你要求的是一个不可能存在的东西。@Dirkedelbuettel我明白你的意思。只是证明了我所要求的对我来说是很有价值的。对于缺少的功能通常有很好的理由,我想这就是其中之一。
> 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