在R中迭代地改变矩阵的特定单元

在R中迭代地改变矩阵的特定单元,r,R,假设我们有一个4,4矩阵。我的目标是迭代地改变单元格1,1,2,1,3,1,1,2,2,1,3 我写了以下内容 for(i in 1:3){ for(j in 1:3){ if(i>j){ A[i,j] = A[i,j] + sample(c(-1,1),prob=c(0.5,0.5)) } } 但是,它不会更改正确的单元格,并且会遗漏必须更改的单元格 矩阵A的形式可以是 A=矩阵C1,1,1,1,1,1,0,1,1,0,0,1,0,0,0,4,4,byrow=T 我认为下面

假设我们有一个4,4矩阵。我的目标是迭代地改变单元格1,1,2,1,3,1,1,2,2,1,3

我写了以下内容

for(i in 1:3){
 for(j in 1:3){
   if(i>j){
  A[i,j] = A[i,j] + sample(c(-1,1),prob=c(0.5,0.5))
}
}
但是,它不会更改正确的单元格,并且会遗漏必须更改的单元格

矩阵A的形式可以是

A=矩阵C1,1,1,1,1,1,0,1,1,0,0,1,0,0,0,4,4,byrow=T

我认为下面的代码块可能是解决方案,至少它为我所做的几次运行提供了正确的答案

A = matrix(c(1,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0),4,4,byrow=T)

k = 0 
for(i in 1:3){
  for(j in 1:(3-k)){
    A[i,j] = A[i,j] + sample(c(-1,1),prob=c(0.5,0.5), size = 1)
  }
  k = k + 1
}



我们可以通过绑定索引的向量来创建行/列索引向量化方法。使用索引将矩阵的单元格子集并赋值我们可以通过C绑定索引向量来创建行/列索引向量化方法。使用索引对矩阵的单元格进行子集划分,并分配我想您只是忘记了设置样本的size=参数,以获得Rademacher宇宙的一张图

set.seed(42)
for (i in 1:3) {
  for (j in 1:3) {
    if (i > j) {
      A[i, j] <- A[i, j] + sample(c(-1, 1), size=1, prob=c(0.5, 0.5))
    }
  }
}
A
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    1    1
# [2,]    0    1    1    0
# [3,]    0    2    0    0
# [4,]    1    0    0    0
另一个想法是使用置换矩阵,您可以根据需要将其子集,并在其上循环

id <- RcppAlgos::permuteGeneral(ncol(B) - 1, ncol(B) - 2, repetition=T)
(id <- id[c(1, 4, 7, 2, 5, 3), ])
#      [,1] [,2]
# [1,]    1    1
# [2,]    2    1
# [3,]    3    1
# [4,]    1    2
# [5,]    2    2
# [6,]    1    3

set.seed(42)
for (i in 1:nrow(id)) {
  A[id[i, 1], id[i, 2]] <- A[id[i, 1], id[i, 2]] + 
    sample(c(-1, 1), size=1, prob=c(0.5, 0.5))
}
A
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    0    1    0
# [3,]    2    1    0    0
# [4,]    1    0    0    0

我想你只是忘了设置样本的size=参数来绘制Rademacher宇宙

set.seed(42)
for (i in 1:3) {
  for (j in 1:3) {
    if (i > j) {
      A[i, j] <- A[i, j] + sample(c(-1, 1), size=1, prob=c(0.5, 0.5))
    }
  }
}
A
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    1    1
# [2,]    0    1    1    0
# [3,]    0    2    0    0
# [4,]    1    0    0    0
另一个想法是使用置换矩阵,您可以根据需要将其子集,并在其上循环

id <- RcppAlgos::permuteGeneral(ncol(B) - 1, ncol(B) - 2, repetition=T)
(id <- id[c(1, 4, 7, 2, 5, 3), ])
#      [,1] [,2]
# [1,]    1    1
# [2,]    2    1
# [3,]    3    1
# [4,]    1    2
# [5,]    2    2
# [6,]    1    3

set.seed(42)
for (i in 1:nrow(id)) {
  A[id[i, 1], id[i, 2]] <- A[id[i, 1], id[i, 2]] + 
    sample(c(-1, 1), size=1, prob=c(0.5, 0.5))
}
A
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    0    1    0
# [3,]    2    1    0    0
# [4,]    1    0    0    0

我可以迭代地这样做吗?例如,更改1,1执行M-H算法,然后更改2,1执行M-H算法等等?@Jonathan1234您的意思是不同的函数应用于不同的集合。在这种情况下,您可以拥有不同的ind集,即ind1我可以迭代地执行吗?例如,更改1,1执行M-H算法,然后更改2,1执行M-H算法等等?@Jonathan1234您的意思是不同的函数应用于不同的集合。在这种情况下,您可以有不同的ind集,即ind1。谢谢,您能否显示预期的输出。根据描述,我假设您希望通过添加示例来更改1,1,2,1,3,1,1,2,2,1,3中的元素?在代码中,您是指ifi>=j@akrun是的,没有特定的输出,只是为了创建一个迭代地改变我指出的单元格的算法。我的问题是矩阵的形式不方便。在对角线中,我们应该只更改单元格1,1和2,2。你能检查我的帖子中更改的for循环解决方案吗。@如果有人也更改了单元格3,2和3,4,这不应该发生,你能显示预期的输出吗。根据描述,我假设您希望通过添加示例来更改1,1,2,1,3,1,1,2,2,1,3中的元素?在代码中,您是指ifi>=j@akrun是的,没有特定的输出,只是为了创建一个迭代地改变我指出的单元格的算法。我的问题是矩阵的形式不方便。在对角线中,我们应该只更改单元格1,1和2,2。你能在我的帖子中检查更改后的for循环解决方案吗?@akrun,其中一个单元格也更改了单元格3,2和3,4,这是不应该发生的