替换R中矩阵中的非对角元素(希望这次问得更好)

替换R中矩阵中的非对角元素(希望这次问得更好),r,replace,R,Replace,好吧,我之前问过这个问题,但是我因为没有具体说明任何事情并且没有显示出之前尝试过的迹象而受到抨击(这是理所当然的)。让我再试一次 我用的是R,我有一个463✕463矩阵。我想做的是用零替换除对角线元素(X11、X22、X33、…、Xjj)之外的所有元素 例如,我想要: [1 4 5 2 3 5 3 9 8] 将是: [1 0 0 0 3 0 0 0 8] 当我使用diag()函数时,它只给我一个对角线值的列向量。我想我可以使用replace()函数,以某种方式与“if not dia

好吧,我之前问过这个问题,但是我因为没有具体说明任何事情并且没有显示出之前尝试过的迹象而受到抨击(这是理所当然的)。让我再试一次

我用的是R,我有一个463✕463矩阵。我想做的是用零替换除对角线元素(X11、X22、X33、…、Xjj)之外的所有元素

例如,我想要:

[1 4 5
 2 3 5
 3 9 8]
将是:

[1 0 0
 0 3 0
 0 0 8]
当我使用
diag()
函数时,它只给我一个对角线值的列向量。我想我可以使用
replace()
函数,以某种方式与“if not diagonal”逻辑相结合……但我迷路了

是的,正如这里的一些人所猜测的,我可能比这里的许多人年轻得多,而且在这方面我是一个全新的人……所以请给我指出正确的方向。非常感谢你的帮助

使用外部 您可以使用以下方法计算逻辑矩阵,该矩阵描述
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)] <- 0
>m[upper.tri(m)| lower.tri(m)]使用外部
您可以使用以下方法计算逻辑矩阵,该矩阵描述
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)] <- 0

>m[upper.tri(m)| lower.tri(m)]在R中,
diag
方法有两个功能

  • 返回矩阵的对角线。即

    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
    
  • 因此,在您的情况下,从现有矩阵中提取对角线并将其提供给
    diag

    diag(diag(m))
    #      [,1] [,2] [,3]
    # [1,]    1    0    0
    # [2,]    0    5    0
    # [3,]    0    0    9
    

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

  • 返回矩阵的对角线。即

    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
    
  • 因此,在您的情况下,从现有矩阵中提取对角线并将其提供给
    diag

    diag(diag(m))
    #      [,1] [,2] [,3]
    # [1,]    1    0    0
    # [2,]    0    5    0
    # [3,]    0    0    9
    
    m[col(m)=行(m)]m[col(m)=行(m)]
    [1] 1 5 9
    >m[col(m)!=行(m)]m
    [,1] [,2] [,3]
    [1,]    1    0    0
    [2,]    0    5    0
    [3,]    0    0    9
    
    m[col(m)=行(m)]m[col(m)=行(m)]
    [1] 1 5 9
    >m[col(m)!=行(m)]m
    [,1] [,2] [,3]
    [1,]    1    0    0
    [2,]    0    5    0
    [3,]    0    0    9
    
    这两种方法都非常有效!非常感谢。两种方法都很有效!非常感谢。确保用你正在使用的语言标记你的问题。在我将另一个问题标记为r后,你得到了一些更好的答案。在写得不好的情况下,通常最好编辑该问题以试图改进它,而不是简单地从一个新问题开始。确保用你正在使用的语言标记你的问题。在我将另一个问题标记为r后,你得到了一些更好的答案。在写得不好的情况下,通常最好编辑该问题以试图改进它,而不是简单地从一个新问题开始。