1

好的,我之前问过这个问题,但我(当之无愧地)因为没有指定任何内容并且没有表现出先前尝试的迹象而受到抨击。所以让我再试一次。。

我正在使用 R,并且我有一个 463✕463 矩阵。我想做的是将除对角线元素(X 11、 X 22、 X 33、...、X jj)以外的所有元素替换为零。

例如我想要:

[1 4 5
 2 3 5
 3 9 8]

成为:

[1 0 0
 0 3 0
 0 0 8]

当我使用该diag()函数时,它只是给了我一个对角线值的列向量。我想我可以replace()以某种方式结合“如果不是对角线”逻辑使用该功能……但我迷路了。

是的,正如这里的一些人所猜测的那样,我可能比这里的许多人年轻得多,而且在这方面完全是新手……所以请让我朝着正确的方向前进。非常感谢您的所有帮助!

4

3 回答 3

3

在 R 中,该diag方法有两个功能。

  1. 返回矩阵的对角线。IE

    m <- matrix(1:9, ncol=3)
    m
    #      [,1] [,2] [,3]
    # [1,]    1    4    7
    # [2,]    2    5    8
    # [3,]    3    6    9
    diag(m)
    # [1] 1 5 9
    
  2. 它可以构造一个对角矩阵。

    diag(1:3)
    #      [,1] [,2] [,3]
    # [1,]    1    0    0
    # [2,]    0    2    0
    # [3,]    0    0    3
    

因此,在您的情况下,从现有矩阵中提取对角线并将其提供给diag

diag(diag(m))
#      [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    0    5    0
# [3,]    0    0    9
于 2013-05-23T06:26:30.287 回答
1

使用外部

n您可以使用以下内容来计算描述×矩阵的非对角元素的逻辑n矩阵:

outer(1:n, 1:n, function(i,j) i!=j)

应用于您的示例:

> m <- matrix(c(1,2,3,4,3,9,5,5,8),ncol=3)
> m
     [,1] [,2] [,3]
[1,]    1    4    5
[2,]    2    3    5
[3,]    3    9    8
> m[outer(1:3, 1:3, function(i,j) i!=j)] <- 0
> m
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    3    0
[3,]    0    0    8

使用三角形

一种可能的替代方法是将对角线两侧的两个三角形组合起来。在这种情况下,您使用矩阵m本身作为输入来确定大小。

upper.tri(m) | lower.tri(m)

应用于您的用例:

> m[upper.tri(m) | lower.tri(m)] <- 0

看来您已经在回复您的原始帖子时得到了这个答案……</p>

于 2013-05-23T06:13:05.097 回答
1
m[ col(m)==row(m) ] <- 0

> m <- matrix(1:9, 3)
> m[ col(m)==row(m) ]
[1] 1 5 9
> m[ col(m)!=row(m) ] <- 0
> m
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    5    0
[3,]    0    0    9
于 2013-05-23T07:11:18.417 回答