2

クロス対角要素を行列に追加したいと思います。たとえば、2次元の3 * 3マトリックスがあり、それを1次元に変換したいとします。

      -------------------
      |  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]れ、にコピーされます。つまり、 7、5、A[1][1]および3が追加されます。A[0][2]B[2]

等々...

4

4 に答える 4

3

各対角線について、row-indexとcolumn-indexの合計が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

すばらしい質問については@Krunalに、回答については@POPOLに+1し、それがどのように機能するかを知りたがっていたため、次の「進行中の作業」を作成しまし

範囲外にフラグを立てる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

考慮すべきいくつかのアイデア:

  • N x N行列Aの対角線から生成された配列Bの長さはNで何ですか?その長さをLと呼びましょう。
  • 要点を強調するために、LはAとどのように関連していますか?これは、外側のループに直接関係しています。
  • Bの各元素の加数の位置はどのように関連していますか?つまり、それらは互いに「対角線」ですが、それを数学的にどのように表現しますか?
  • それを数学的に表現できるとしたら、それらの合計を見つけるために、それらの間でどのように反復しますか?これは、内側のループに役立ちます。
于 2012-11-15T10:04:19.183 に答える
0

これは、forループを使用しない2行のソリューションです。

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 に答える