有没有办法排除C+中的行和列+;阵列? 假设我在C++中有一个数组,例如: 1 2 3 4 = arr 5 6 7 8 9 9 8 9 7 6 1 3

有没有办法排除C+中的行和列+;阵列? 假设我在C++中有一个数组,例如: 1 2 3 4 = arr 5 6 7 8 9 9 8 9 7 6 1 3,c++,arrays,c++11,rcpp,C++,Arrays,C++11,Rcpp,是否有一种简洁的方法排除任何行和/或列 例如,假设我要对以下数组执行操作: 1 3 4 5 7 8 7 1 3 在其他编程语言中,使用arr[-3,-2]排除第三行和第二列,可以相当容易地获得上述数组。但是,我一直无法找到一种简洁的方法来排除C++中的行和列。你会怎么做 更新: 我想这是一个XY问题。让我告诉你我为什么要这么做 我正在运行一个统计模型,特别是一个条件自回归(CAR)模型。在这个高斯模型中,我们需要均值函数和协方差矩阵 我们得到的平均函数为 平均值=mu+Sig(i,

是否有一种简洁的方法排除任何行和/或列

例如,假设我要对以下数组执行操作:

1  3  4
5  7  8
7  1  3
在其他编程语言中,使用arr[-3,-2]排除第三行和第二列,可以相当容易地获得上述数组。但是,我一直无法找到一种简洁的方法来排除C++中的行和列。你会怎么做

更新:

我想这是一个XY问题。让我告诉你我为什么要这么做

我正在运行一个统计模型,特别是一个条件自回归(CAR)模型。在这个高斯模型中,我们需要均值函数和协方差矩阵

我们得到的平均函数为

平均值=mu+Sig(i,-i)*inv(Sig(-i,-i))*(v(i,-i)-mu)

协方差矩阵为

s2=Sig(i,i)-Sig(i,-i)*inv(Sig(-i,-i))*Sig(-i,i)

所以,我需要得到矩阵Sig的三个变体:Sig(l,-l),Sig(-l,-l),Sig(-l,l)。这就是为什么我希望找到一种排除行和列的简单方法。我通常会用R来编程,但这需要很长时间。所以,我希望它能在Rcpp中发挥作用

下一次更新:

我想我已经弄明白了,所以谢谢你的评论。这就是我的想法。我需要一个向量来存储我想保留在子矩阵中的索引。我计划使用Rcpp的X.submat()函数

假设我想要得到Sig的子矩阵,它不包括第I行和第I列。然后,我必须有一个索引向量,包含{0,1,…,(I-2),i,…,(L-1)},因为C++索引在0开始。为了获得这个索引向量,我有以下代码:

// We need to get the vector of indices excluding i
  arma::vec vece = arma::zeros(L-1); // vector to exclude the ith index
  for(int k = 0; k < (L-1); k++){ // we have a vector of length L-1
    if(k < (i-1)){
      vece(k)=k;
    }
    else if(k == (i-1)){
      // do not add the ith index
    }
    else{ // k > (i-1)
      vece(k-1) = k;
    }
  }
  
  // We need to make Sig(-i,-i)
  arma::mat Sigee = arma::zeros(L-1,L-1); // ee for exclude,exclude
  Sigee = Sig.submat(vece,vece)
//我们需要得到除i之外的索引向量
arma::vec vece=arma::零(L-1);//向量以排除第i个索引
对于(int k=0;k<(L-1);k++){//我们有一个长度为L-1的向量
如果(k<(i-1)){
向量(k)=k;
}
else如果(k==(i-1)){
//不要添加第i个索引
}
else{//k>(i-1)
向量(k-1)=k;
}
}
//我们需要制作Sig(-i,-i)
arma::mat Sigee=arma::零(L-1,L-1);//ee表示排除,排除
Sigee=Sig.submat(向量,向量)
但是,当i=0时,这似乎不起作用。我在下面的for循环中有这段代码,所以我需要在I=0时使用它

for(int l = 0; l < L; l++){                     }
for(int l=0;l
对我来说,似乎更直接的方法是用顺序整数填充
n-1
length
uvec
,只需跳过
i
,如下所示:

/[[Rcpp::depends(RcppArmadillo)]]
#包括
//[[Rcpp::导出]]
arma::mat排除一行和列(常数arma::mat&X,arma::uword i){
arma::uwordn=X.n_行;//X应该是正方形,所以只需要#行
arma::uvec idx(n-1);//到子集的索引向量
arma::uword ii=0;//我们将在idx的每个元素处添加的整数
对于(arma::uwordj=0;j<(n-1);++j){//对于idx的每个元素
如果(ii==i){//如果ii=i,我们需要跳过i
ii+=1;//(即,将1添加到ii)
}
idx[j]=ii;//然后我们为这个元素存储ii
ii+=1;//和增量ii
}
返回X.submat(idx,idx);//最后我们可以将矩阵子集化
}
一个简单的演示表明,这是可以预期的:


X是否有一种简洁的方法来排除任何行和/或列?--听起来像一个。可能可以用范围视图完成。但是OP最好能描述他们的最终目标,你可以尝试间接的方式。让另一个数组表示要在该数组上处理和循环的索引,即
array[index[i]]
而不是
array[i]
。如果其他语言就是这样做到的,我不会感到惊讶。你能用一些线性代数库吗?喜欢-然后你可以切片、反转、乘法等。当你的另一个问题被标记为
rcpparmadillo
时,你可能想看看优秀的答案。特别是,我给出的链接指向“子矩阵视图”主题。您可以查看
.submat()
方法,该方法基本上使用了@PaulMcKenzie提到的间接方法。这有点像标准的犰狳。这非常有效-谢谢!只有一个后续问题:Rcpp的索引:函数像C++还是R?让我进一步解释一下。我们知道R的索引从1开始,C++从0开始。所以,假设我想在Cpp中调用Rcpp::qnorm(p(I))。好的,我从0开始,所以我自然落后于R中正确的索引。当我调用Rcpp::qnrom(p(i))时,如果我想获得相对正确的值,我应该调用Rcpp::qnorm(p(i+1))来纠正索引中的偏移吗?或者RCPP自动纠正索引的移位吗?@ RunScript编写C++使用<代码> Rcpp < /C> >或<代码> RcppArmadillo < /C>函数与其他C++、0索引和ALLO一样工作,听起来我不需要转换索引。谢谢你的澄清!