【问题标题】:R - how do I replace the lower triangular of part of a non-square matrix with the lower triangular of a square matrix?R - 如何用方阵的下三角替换非方阵的下三角?
【发布时间】:2018-03-22 21:48:06
【问题描述】:

我在R中有两个矩阵,一个方阵和一个非方阵:

dataMatrix1,一个 5x5 矩阵:

1 2 3 4 3
2 1 3 5 7
3 3 1 1 8
4 5 1 1 5
1 7 8 5 1

dataMatrix2,一个 5x8 矩阵:

1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
0.2 1 0.3 0.5 0.7 0.8 0.6 0.1
0.3 0.3 1 0.1 0.8 0.3 0.1 0.6
0.4 0.5 0.1 1 0.5 0.3 0.1 0.7
0.1 0.7 0.8 0.5 1 0.5 0.9 0.9

我想用 dataMatrix1 的下三角形替换 dataMatrix2 的前 5x5 元素的下三角形部分,所以我会得到以下矩阵:

1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
2   1 0.3 0.5 0.7 0.8 0.6 0.1
3   3   1 0.1 0.8 0.3 0.1 0.6
4   5   1   1 0.5 0.3 0.1 0.7
1   7   8   5   1 0.5 0.9 0.9

我只是组成了这些矩阵的值以用作示例,我必须对几个矩阵进行此操作。是否有系统的方法来实现这一目标?

数据

m1 <-"
1 2 3 4 3
2 1 3 5 7
3 3 1 1 8
4 5 1 1 5
1 7 8 5 1"
m1 <- as.matrix(read.table(text=m1,h=F))

m2 <-"
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
0.2 1 0.3 0.5 0.7 0.8 0.6 0.1
0.3 0.3 1 0.1 0.8 0.3 0.1 0.6
0.4 0.5 0.1 1 0.5 0.3 0.1 0.7
0.1 0.7 0.8 0.5 1 0.5 0.9 0.9"
m2 <- as.matrix(read.table(text=m2,h=F))

【问题讨论】:

    标签: r matrix triangular


    【解决方案1】:

    您可以使用lower.tri() 函数 - 它在两个矩阵上都能正常工作:

    mat1 <- matrix(1:25, nrow=5)
    mat2 <- matrix(rnorm(50), nrow=5)
    

    这是lower.tri的结果:

    > lower.tri(mat1)
          [,1]  [,2]  [,3]  [,4]  [,5]
    [1,] FALSE FALSE FALSE FALSE FALSE
    [2,]  TRUE FALSE FALSE FALSE FALSE
    [3,]  TRUE  TRUE FALSE FALSE FALSE
    [4,]  TRUE  TRUE  TRUE FALSE FALSE
    [5,]  TRUE  TRUE  TRUE  TRUE FALSE
    
    > lower.tri(mat2)
          [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
    [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [2,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [3,]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [4,]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    [5,]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    

    你可以用它来替换:

    mat2[lower.tri(mat2)] <- mat1[lower.tri(mat1)]
    mat2
    > mat2
             [,1]       [,2]       [,3]       [,4]        [,5]       [,6]        [,7]       [,8]        [,9]       [,10]
    [1,] 1.217691  0.3217439  1.2819224 -0.8618631  0.42995995  1.6090869 -0.01434864  1.4435626 -0.49071287  0.24014275
    [2,] 2.000000  0.9499850 -0.8694622 -0.4298002 -0.18049240 -0.4742643  0.66824074  0.5185916  0.08725232 -0.38885167
    [3,] 3.000000  8.0000000 -0.4522152 -1.1518328 -0.97425214 -0.1934794 -1.21050069 -0.3670091 -1.08416208  0.65378101
    [4,] 4.000000  9.0000000 14.0000000 -0.7285091 -0.75610467  2.7866430 -0.63774276 -1.3474289 -0.25998202  1.57901406
    [5,] 5.000000 10.0000000 15.0000000 20.0000000 -0.07180773 -0.5519527  0.29733510  0.7673501 -1.78309776  0.04265967
    

    【讨论】:

    • 有那么一秒钟,由于尺寸不同,我认为它不会起作用,但它显然可以!
    • 在这种情况下,我们可以通过转置和获取upper.tri 来解决这个问题
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多