在R中迭代地改变矩阵的特定单元
假设我们有一个4,4矩阵。我的目标是迭代地改变单元格1,1,2,1,3,1,1,2,2,1,3 我写了以下内容在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 我认为下面
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,这是不应该发生的