13

我在 R 中有一个矩阵,我想得到:

Max off - diagonal elements
Min off – diagonal elements
Mean off –diagonal elements

对角线我使用 max(diag(A)) , min(diag(A)) , mean(diag(A)) 并且工作得很好

但是对于非对角线我试过

dataD <- subset(A, V1!=V2)

Error in subset.matrix(A, V1 != V2) : object 'V1' not found

使用:

colMeans(dataD) # get the mean for columns

但我无法获取 dataD b/c 它说找不到对象“V1”

谢谢!

4

6 回答 6

28

这里的row()col()辅助函数很有用。使用 @James A,我们可以使用这个小技巧获得上非对角线:

> A[row(A) == (col(A) - 1)]
[1]  5 10 15

和通过这个降低对角线:

> A[row(A) == (col(A) + 1)]
[1]  2  7 12

这些可以概括为您想要的任何对角线:

> A[row(A) == (col(A) - 2)]
[1]  9 14

并且不需要任何子集。

然后,在这些值上调用您想要的任何函数是一件简单的事情。例如:

> mean(A[row(A) == (col(A) - 1)])
[1] 10

如果根据我的评论,您的意思是对角线以外的所有内容,请使用

> diag(A) <- NA
> mean(A, na.rm = TRUE)
[1] 8.5
> max(A, na.rm = TRUE)
[1] 15
> # etc. using sum(A, na.rm = TRUE), min(A, na.rm = TRUE), etc..

所以这不会丢失,Ben Bolker 建议(在评论中)上面的代码块可以使用我上面提到的row()andcol()函数更巧妙地完成:

mean(A[row(A)!=col(A)])
min(A[row(A)!=col(A)])
max(A[row(A)!=col(A)])
sum(A[row(A)!=col(A)])

这是一个更好的解决方案。

于 2012-10-24T13:02:06.600 回答
7

在一行简单的代码中:

对于矩阵 A,如果您希望找到上下对角线的最小值、第一四分位数、中位数、平均值、第三四分位数和最大值:

summary(c(A[upper.tri(A)],A[lower.tri(A)])).

于 2013-03-14T14:26:44.083 回答
4

适当子集的diag矩阵将为您提供非对角线。例如:

A <- matrix(1:16,4)
#upper off-diagonal
diag(A[-4,-1])
[1]  5 10 15
#lower off-diagonal
diag(A[-1,-4])
[1]  2  7 12
于 2012-10-24T12:59:08.587 回答
1

要获得一个包含矩阵每个列或行的非对角元素的最大值的向量,还需要几个步骤。在寻求帮助时,我被指引到这里。也许其他人也会这样做,所以我提供了这个解决方案,我发现它使用了我在这里学到的东西。

诀窍是创建一个仅包含非对角元素的矩阵。考虑:

> A <- matrix(c(10,2,3, 4,10,6, 7,8,10), ncol=3)
> A
     [,1] [,2] [,3]
[1,]   10    4    7
[2,]    2   10    8
[3,]    3    6   10
> apply(A, 2, max)
[1] 10 10 10

使用建议的索引进行子集A[row(A)!=col(A)]化,按列顺序生成一个非对角元素向量:

> v <- A[row(A)!=col(A)]
> v
[1] 2 3 4 6 7 8

将其返回到矩阵允许使用apply()将选择函数应用于仅非对角元素的边距。以max函数为例:

> A.off <- matrix(v, ncol=3)
> A.off
     [,1] [,2] [,3]
[1,]    2    4    7
[2,]    3    6    8
> v <- apply(A.off, 2, max)
> v
[1] 3 6 8

整个操作可以在一行中紧凑地——而且相当隐秘地——编码:

> v <- apply(matrix(A[row(A)!=col(A)], ncol=ncol(A)), 2, max)
> v
[1] 3 6 8
于 2014-04-20T12:12:43.810 回答
0

只需将矩阵 A 乘以 1-diag (nofelements)

例如,如果 A 是一个 4x4 矩阵,那么

平均值(A*(1-diag(4)) 或 A*(1-diag(nrow(A)))

当您需要多次运行同一行代码时,这会更快

于 2013-06-06T14:45:20.057 回答
-1

除了詹姆斯的回答,我想补充一点,您可以使用 diag 函数直接排除矩阵的所有对角线元素A[-diag(A)]。例如,考虑: summary(A[-diag(A)])

于 2012-10-24T13:41:27.430 回答