将列表中多个矩阵的上三角复制到下三角

17

我希望将存储在列表中的一组矩阵的上三角复制到下三角。

创建一个只填充了数据的上三角的矩阵列表:

m1<-matrix(1:9, 3, 3);lower.tri(m1);m1[lower.tri(m1)]<- NA; m1
m2<-matrix(9:18, 3, 3);lower.tri(m2);m2[lower.tri(m2)]<- NA; m2
m3<-matrix(18:27, 3, 3);lower.tri(m3);m3[lower.tri(m3)]<- NA; m3
m4<-matrix(27:36, 3, 3);lower.tri(m4);m4[lower.tri(m4)]<- NA; m4

L<-list(m1,m2, m3, m4); L

要将矩阵的上三角复制到下三角,您可以使用:

M <- m1
for(i in 1:nrow(M)) {for(j in 1:i) {M[i,j]=M[j,i] }}
M

然而,我希望将列表"L"中每个矩阵的上三角形复制到下三角形。

1个回答

30

这种任务的典型策略是首先编写一个函数,对单个列表元素(例如单个上三角矩阵)执行所需操作,然后使用lapply()依次将其应用于每个列表元素。

在这种情况下,我会使用以下方法:

f <- function(m) {
    m[lower.tri(m)] <- t(m)[lower.tri(m)]
    m
}

## Check that it works on a single list element
f(L[[1]])
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    4    5    8
# [3,]    7    8    9

## Use lapply() to apply it to each list element
lapply(L, f)
# [[1]]
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    4    5    8
# [3,]    7    8    9
# 
# [[2]]
#      [,1] [,2] [,3]
# [1,]    9   12   15
# [2,]   12   13   16
# [3,]   15   16   17
# 
# [[3]]
#      [,1] [,2] [,3]
# [1,]   18   21   24
# [2,]   21   22   25
# [3,]   24   25   26
# 
# [[4]]
#      [,1] [,2] [,3]
# [1,]   27   30   33
# [2,]   30   31   34
# [3,]   33   34   35

4
将下三角矩阵复制到上三角:m[upper.tri(m)] <- t(m)[upper.tri(m)]。 (说明:此代码用于将矩阵的下三角区域复制到上三角区域) - Kyle Simek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接