2

我想将矩阵中的交叉对角线元素加在一起。例如,我有一个二维的 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]and将被添加并复制到A[1][1],即7、5和 3 将被添加。A[0][2]B[2]

等等...

4

4 回答 4

3

请注意,对于每个对角线,行索引和列索引的总和等于 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
  }
} 
于 2012-11-15T10:05:27.280 回答
1

+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>
于 2012-11-15T10:50:24.117 回答
0

这是一个不使用 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 包的一部分。

于 2013-04-01T23:28:12.483 回答
0

需要考虑的一些想法:

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