将矩阵对角线转换为参差不齐的数组?

时间:2009-03-13 06:22:08

标签: math matrix

我正试图针对以下问题提出一个非暴力解决方案。给定任意大小的矩阵:

[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)

(在本例中从左下角到右上角)

有没有一种优雅的方法可以做到这一点,只需迭代左栏和顶行?

3 个答案:

答案 0 :(得分:2)

我只想编写一个小函数来将矢量索引转换为矩阵索引。

假设矩阵为NxN平方,则会有2N-1个向量;如果我们将矢量从0编号为2N-2,则矢量k的元素n将位于行max(N-1-n+k,k)和列max(n+k-N+1,k)(或相反,行i,列j的矩阵元素将是向量min(i,j)的元素N-1+j-i。然后,只要您需要访问向量的元素,只需将坐标从k,n转换为i,j(即,将向量索引转换为矩阵索引)并访问矩阵的相应元素。而不是实际拥有一个向量列表,你最终会得到模拟一个向量列表的东西,因为它可以为你提供列表中任何向量的任何所需元素 - 这是真的一样好。 (欢迎来到鸭子打字; - )

但是,如果要访问矩阵的每个元素,迭代可能会更快,而不是每次都进行此计算。

答案 1 :(得分: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混淆了,现在纠正了。

答案 2 :(得分: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}]

其中给出了第i个对角线的列表,其中第0个对角线是主对角线,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}