代码之家  ›  专栏  ›  技术社区  ›  llrs

对称矩阵中每个单元格中的值组合

  •  1
  • llrs  · 技术社区  · 8 年前

    我有一个权重向量,我想把它插入一个对称矩阵中。我想要所有的重量组合(所有的重量都在所有的位置,而不是对角线)

    我试着迭代矩阵,但只得到相同的矩阵三份。(我也找不到答案或这个问题的公共解决方案。)

    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)并不重要,所以如果一个解决方案忽略了它,我就不在乎了。

    2 回复  |  直到 8 年前
        1
  •  1
  •   LAP    8 年前

    不知道你想要这个做什么,但现在开始:

    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
    

    ……

        2
  •  1
  •   llrs    8 年前

    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
        }
      }
    }
    

    length(unlist(unlist(C_list, recursive = FALSE), recursive = FALSE)) == 1000 这是存在的10^3个组合。