【问题标题】:Calculate the sum of cross-diagonal elements in a matrix [closed]计算矩阵中对角线元素的总和 [关闭]
【发布时间】:2012-11-15 09:55:07
【问题描述】:

我想将矩阵中的交叉对角线元素相加。例如,我有一个 3*3 的二维矩阵,我想将其转换为一维:

      -------------------
      |  1  |  2  |  3  |
      -------------------
 A=   |  4  |  5  |  6  |
      -------------------
      |  7  |  8  |  9  |
      -------------------

最终输出将是,

     ____ ____ ____ ____ ____
 B= |1   | 6  | 15 | 14 |  9 |
    |____|____|____|____|____|

第一个交叉对角线A[0][0] 将被复制到B[0]

然后将添加下一个交叉对角线元素A[1][0]A[0][1]并复制到B[1]将添加4和2。

然后将添加下一个交叉对角线元素A[2][0]A[1][1]A[0][2]并复制到B[2]将添加7、5和3。 p>

等等……

【问题讨论】:

    标签: math for-loop matrix


    【解决方案1】:

    请注意,对于每个对角线,行索引和列索引之和等于 B 数组的索引。基于这个事实,你可以做出这样的算法:

    // assuming the width and length of the Matrix is N
    // it's good you have some ideas of the range of idea, try figure it out by yourself? 
    // definitely it should be a function of N
    for (int i=0;i<F(N);i++) { 
      for (int j=0;j<=i;j++) { // consider why j should be in range (0,i) ?
        // some cumulatively add here
      }
    } 
    

    【讨论】:

    • 噢,伙计,这完全是“作业问题”——你太容易给出答案了
    • 我认为在外循环中,条件应该是&lt;= 而不是&lt;
    • @Kache 啊哦...也许我应该隐藏一些代码行...
    • @Krunal 要看索引是从0开始还是从1开始,试试看!
    【解决方案2】:

    +1 给@Krunal 的好问题和@POPOL 的答案,很想看看它是如何工作的,所以创建了以下“正在进行的工作”:fiddle here

    我将查看循环中需要什么,以便消除标记超出范围的 try 例程。

        <!DOCTYPE HTML>
        <html lang="en-US">
        <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            var a = [   [1,2,3],
                        [4,5,6],
                        [7,8,9],
                        [10,11,12],
                        [13,14,15]
                        ];
            var b = [],N = 4; 
            var item;
            for (i=0;i<2*N-1;i++) {
              b[i] = 0;
              for (j=0;j<=i;j++) {
                try {
                    item  = (a[j][i-j] !== undefined)?a[j][i-j]:0;
                }catch(e) {
                    console.log("out of range");
                    item  =0;
                }
                b[i] +=item;
              }
            }
        </script>
        </head>
        <body>
        <div id="output"></div>
        <script type="text/javascript">
            for (w=0;w<b.length-1;w++) {
                document.getElementById("output").innerHTML+=b[w] +",";
            } 
            document.getElementById("output").innerHTML+=b[b.length-1] ;
        </script>
        </body>
        </html>
    

    【讨论】:

      【解决方案3】:

      需要考虑的一些想法:

      • 从 N x N 矩阵 A 的对角线生成的数组 B 的长度(以 N 计)是多少?让我们将该长度称为 L。
      • 只是为了强调一点,L 与 A 有什么关系?这与外循环直接相关。
      • B 中每个元素的加数位置如何相互关联?即它们彼此是“对角线”的,但是您将如何用数学方式表达呢?
      • 如果您可以用数学方法表达,您将如何在它们之间进行迭代以求出它们的总和?这将帮助您处理内部循环。

      【讨论】:

        【解决方案4】:

        这是一个不使用 for 循环的两行解决方案:

        x=rbind(matrix(0, nc=ncol(A), nr=ncol(A)-1), A, matrix(0, nc=ncol(A), nr=ncol(A)-1))  
        laply(seq(sum(dim(A))-1), function(l) sum(diag(t(x[, ncol(A):1])[, l:nrow(x)])))  
        

        [1] 1 6 15 14 9

        laply() 函数是 plyr 包的一部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-02
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多