【问题标题】:Combinations of values in each cell in a symmetric matrix对称矩阵中每个单元格中的值组合
【发布时间】:2018-06-20 10:47:39
【问题描述】:

我有一个要插入对称矩阵的权重向量。我想要所有权重组合(所有位置的所有权重,但不在对角线上)

我尝试遍历矩阵,但我只得到相同的矩阵三次。 (我也找不到这个问题的答案或公共解决方案。)

weight <- seq(0.1, 1, by = 0.1)
C <- matrix(0, nrow = 3, ncol = 3)
for (i in seq_len(nrow(C))) {
  C_old <- C
  for (j in seq_len(i)) {
    if (i == j) {
      C[i, i] <- 0
    } else {
      C_old2 <- C_old
      for (w in weight) {
        C[i, j] <- w
        C[j, i] <- C[i, j]
        C_old[i, j] <- w
        C_old[j, i] <- C_old[i, j]
        C_old2[i, j] <- w
        C_old2[j, i] <- C_old2[i, j]
        iter <- iter + 3
        print(C)
        print(C_old)
        print(C_old2)
      }
   }
}

我想拥有所有这样的矩阵

Matrix 0:

0 0 0
0 0 0
0 0 0 


Matrix 1:

0 0 0
0 0 0.1
0 0.1 0 

Matrix 2:

0 0 0.1
0 0 0.1
0.1 0.1 0 


Matrix 3:

0 0.1 0.1
0.1 0 0.1
0.1 0.1 0 

Matrix 4:

0 0.1 0.1
0.1 0 0.2
0.1 0.2 0 


Matrix n:

0 0.9 0.1
0.5 0 0.5
0.1 0.9 0 


Matrix:

0 x y
z 0 z
y x 0 

我希望最后一个矩阵的所有组合都是 x、y 和 z 可以是任何权重值。

第一个矩阵(全为 0)并不重要,所以如果一个解决方案省略了它,我真的不在乎

【问题讨论】:

    标签: r matrix symmetric


    【解决方案1】:

    不知道你想要这个做什么,但是你去吧:

    weight <- seq(0.1, 1, by = 0.1)
    C <- matrix(0, nrow = 3, ncol = 3)
    C_list <- vector("list", 10)
    
    for(i in 1:length(weight)){
      for(j in 1:3){
        if(j == 1){
          C[2,3] <- weight[i]
          C[3,2] <- weight[i]
        }
        if(j == 2){
          C[1,3] <- weight[i]
          C[3,1] <- weight[i]
        }
        if(j == 3){
          C[1,2] <- weight[i]
          C[2,1] <- weight[i]
        }
        C_list[[i]][[j]] <- C
      }
    }
    

    结果:

    > C_list
    [[1]]
    [[1]][[1]]
         [,1] [,2] [,3]
    [1,]    0  0.0  0.0
    [2,]    0  0.0  0.1
    [3,]    0  0.1  0.0
    
    [[1]][[2]]
         [,1] [,2] [,3]
    [1,]  0.0  0.0  0.1
    [2,]  0.0  0.0  0.1
    [3,]  0.1  0.1  0.0
    
    [[1]][[3]]
         [,1] [,2] [,3]
    [1,]  0.0  0.1  0.1
    [2,]  0.1  0.0  0.1
    [3,]  0.1  0.1  0.0
    
    
    [[2]]
    [[2]][[1]]
         [,1] [,2] [,3]
    [1,]  0.0  0.1  0.1
    [2,]  0.1  0.0  0.2
    [3,]  0.1  0.2  0.0
    
    [[2]][[2]]
         [,1] [,2] [,3]
    [1,]  0.0  0.1  0.2
    [2,]  0.1  0.0  0.2
    [3,]  0.2  0.2  0.0
    

    ...

    【讨论】:

    • 我将编辑我的问题,因为我解释得不好。我想要所有组合,所以我可能有一个 0.8,在同一个矩阵中有一个 0.2 和一个 0.5 的单元格值。顺便说一句,这是我用来分析一些数据的模型。我正在尝试找到此参数的最佳值。
    【解决方案2】:

    多亏了 LAP,我改变了方法并设法做到了:

    weight <- seq(0.1, 1, by = 0.1)
    C <- matrix(0, nrow = 3, ncol = 3)
    C_list <- vector("list", 10)
    names(C_list) <- as.character(weight)
    
    for(i1 in weight){
      C_list[[as.character(i1)]] <- vector("list", 10)
      names(C_list[[as.character(i1)]]) <- as.character(weight)
      for (i2 in weight){
        C_list[[as.character(i1)]][[as.character(i2)]] <- vector("list", 10)
        names(C_list[[as.character(i1)]][[as.character(i2)]]) <- as.character(weight)
        for (i3 in weight) {
          C[2, 3] <- i1
          C[3, 2] <- i1
          C[1, 3] <- i2
          C[3, 1] <- i2
          C[1, 2] <- i3
          C[2, 1] <- i3
          C_list[[as.character(i1)]][[as.character(i2)]][[as.character(i3)]] <- C
        }
      }
    }
    

    现在 C_list 是一个列表列表,每个列表都有一个矩阵。 length(unlist(unlist(C_list, recursive = FALSE), recursive = FALSE)) == 1000 是存在的 10^3 种组合。

    【讨论】:

    • 感谢您的时间和想法,我希望我现在可以以某种方式扩展到更多职位,但这总比没有好。谢谢
    猜你喜欢
    • 2014-01-22
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多