3

次の問題に対する非力ずくの解決策を考え出そうとしています。任意のサイズの行列が与えられた場合:

[6  0  3  5]
[3  7  1  4]
[1  4  8  2]
[0  2  5  9]

次のように、その対角線をベクトルのリストに変換します。

(0)
(1, 2)
(3, 4, 5)
(6, 7, 8, 9)
(0, 1, 2)
(3, 4)
(5)

(この例では、左下から右上に向かって作業します)

左の列と一番上の行を反復する以外に、これを行うエレガントな方法はありますか?

4

3 に答える 3

2

ベクトルのインデックスを行列のインデックスに変換する小さな関数を書くだけです。

行列がNxN正方形だとすると、2N-1ベクトルがあります。0からまでのベクトルに番号を付けると、ベクトルの2N-2要素は行と列になります(または逆に、行と列の行列要素はベクトルの要素になります)。次に、ベクトルの要素にアクセスする必要があるときはいつでも、座標を から に変換し(つまり、ベクトル インデックスを行列インデックスに変換)、行列の適切な要素にアクセスします。実際にベクトルのリストを持つ代わりに、エミュレートするものになりますknmax(N-1-n+k,k)max(n+k-N+1,k)ijmin(i,j)N-1+j-ik,ni,jリスト内の任意のベクトルの任意の要素を提供できるという意味で、ベクトルのリスト-これは実際には同じように優れています。(ダックタイピングへようこそ;-)

ただし、行列のすべての要素にアクセスする場合は、この計算を毎回行うよりも、反復する方が速いかもしれません。

于 2009-03-13T07:05:18.007 に答える
1

(チェックされていないコード)次のようなもの(Javaコード):

// suppose m is the matrix, so basically an int[][] array with r rows and c columns
// m is an int[rows][cols];

List result = new ArrayList(rows + cols - 1);
for (int i = 0; i < (rows + cols - 1))
{
  int y;
  int x;
  if (i < rows)
  {
    x = 0;
    y = rows - i - 1;
  }
  else
  {
    x = i - rows + 1;
    y = 0;
  }
  Vector v = new Vector();
  while (y < rows && x < cols)
  {
    y++;
    x++;
    v.add(new Integer(m[y][c]));
  }
  result.add(v);
}
// result now contains the vectors you wanted

編集: x と y が混同されていましたが、修正されました。

于 2009-03-13T07:10:44.950 に答える
0

マテマティカ:

m = {{6, 0, 3, 5}, 
     {3, 7, 1, 4}, 
     {1, 4, 8, 2}, 
     {0, 2, 5, 9}};

Table[Diagonal[m, i], {i, 1 - Length@m, Length@m[[1]] - 1}]

これは、0 番目の対角線が主な対角線である i 番目の対角線のリストを提供し、i = -1 はその下の対角線を提供します。つまり、次のように返されます。

{{0}, {1, 2}, {3, 4, 5}, {6, 7, 8, 9}, {0, 1, 2}, {3, 4}, {5}}

もちろん、組み込みDiagonal関数を使用することは一種の不正行為です。Diagonalゼロからの実装は次のとおりです。

(* Grab the diagonal starting from element (i,j). *)
diag0[m_,i_,j_] := Table[m[[i+k, j+k]], {k, 0, Min[Length[m]-i, Length@m[[1]]-j]}]

(* The i'th diagonal -- negative means below the main diagonal, positive above. *)
Diagonal[m_, i_] := If[i < 0, diag0[m, 1-i, 1], diag0[m, 1, i+1]]

Table関数は基本的に、リストに収集する for ループです。例えば、

Table[2*i, {i, 1, 5}]

戻ります{2,4,6,8,10}

于 2009-03-13T18:59:18.600 に答える