【问题标题】:How to replace non-diagonal elements in a matrix?如何替换矩阵中的非对角元素?
【发布时间】:2013-05-23 04:02:26
【问题描述】:

更具体地说,我希望除对角线元素(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]

这可能吗?抱歉,我完全是个菜鸟。。

【问题讨论】:

  • 什么编程语言?什么语境?就目前而言,很难说出您在这里问什么,任何语言的实现都可以吗?
  • @PLB 这里的社区也强烈谴责劝阻新人。请用更好的词来引用你的想法。
  • @loxxy:社区(如果你愿意这样称呼它)不是家庭作业机器。如果你有一个有趣的问题,有人可能会帮助你。在这种情况下,没有问题。有一个简单的任务,没有尝试(至少从 OP 在帖子中提到的内容来看)。
  • @loxxy 你用更好的词是什么意思? IMO,我没有说任何坏话。
  • @Blender 好吧,我很难想到 OP 甚至可能是一个小孩,对他来说这绝对是一个有趣的问题。

标签: r replace diagonal


【解决方案1】:

最简单的方法是创建一个用 0 填充的新矩阵,然后用旧矩阵的对角线替换它的对角线。

如果你有:

m <- cbind(c(1,2,3), c(4,3,9), c(5, 5, 8))  # The original matrix

diagonal <- diag(m)
m <- matrix(0, nrow(m), ncol(m))  # Overwrite the old matrix
diag(m) <- diagonal

【讨论】:

    【解决方案2】:

    这是一个简单的单行。首先,获取数据:

    > (a <- matrix(scan(),nr=3,byrow=TRUE))
    1: 1 4 5 2 3 5 3 9 8
    10: 
    Read 9 items
         [,1] [,2] [,3]
    [1,]    1    4    5
    [2,]    2    3    5
    [3,]    3    9    8
    

    方法一:

    > diag(diag(a))
         [,1] [,2] [,3]
    [1,]    1    0    0
    [2,]    0    3    0
    [3,]    0    0    8
    

    问题是,如果它的参数是一个矩阵,diag 提取对角线...但是如果参数是一个向量,它是一个创建的函数一个对角矩阵。所以只需使用它两次。 (事实上​​,diag四种 不同的用途,具体取决于你给它的用途,尽管其中两种情况非常相似。)请参阅 ?diag

    如果您的矩阵很大,这可能不是最有效的方法,但对于中等大小的情况,我就是这样做的。

    ---

    方法二:

    一种完全不同的单线也有效 -

    ifelse(row(a)==col(a),a,0)
    

    两者在方阵上的工作方式相同。但是它们在非方阵上有不同的结果——第一个返回一个方阵(维度是两个原始维度中较小的那个),而第二个返回一个与其参数形状相同的对象;根据具体情况,这可能很有用。

    【讨论】:

      【解决方案3】:

      对于 n x m 的矩阵

      for i to n
          for j to m
              if i != j
                  matrix[i][j] = 0;
      

      【讨论】:

      • 现在这个问题被标记为r,我认为你的回答没有太大帮助。首先,语法不匹配,其次,以这种方式编写显式循环对性能不利。
      • 是的,但是这个答案仍然可以作为问题的算法通过,IMO。
      【解决方案4】:

      如果m 是您的矩阵,请尝试:

      m = matrix(c(1,4,5,2,3,5,3,9,8),3,3)
      m[upper.tri(m) | lower.tri(m)] = 0
      
      m
      
      ##      [,1] [,2] [,3]
      ## [1,]    1    0    0
      ## [2,]    0    3    0
      ## [3,]    0    0    8
      

      【讨论】:

        【解决方案5】:

        这仅取决于您正在处理的矩阵的大小,假设您有一个 nxn 矩阵,那么对角线将位于这些位置 0, n+1 , 2(n +1), 3(n+1),... 如果您提到的矩阵不是多维的并且是线性的!因此,只需编写一个 for 循环就可以了。

        【讨论】:

          【解决方案6】:

          我正在从your second post on this topic 转移my answer

          您可以使用以下方法计算描述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
          

          我也喜欢@e4e5f4triangle approach。这可能比这里的代码快一点,但是这里的代码可能更容易适应不同的情况。所以很高兴知道这个,即使那个可能更适合您当前的应用程序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-05
            • 2018-05-18
            • 1970-01-01
            • 2023-04-08
            相关资源
            最近更新 更多