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

Math 将矩阵对角线转换为参差不齐数组?,math,matrix,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) (本例中从左下到右上) 除了迭代左列和顶行之外,有没有一种优雅的方法可以做到这一点?我只需编写一个函数,将向量索引转换为矩阵索引 假设矩阵是NxNsquare,那么就会有2N-

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

[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)
(本例中从左下到右上)


除了迭代左列和顶行之外,有没有一种优雅的方法可以做到这一点?

我只需编写一个函数,将向量索引转换为矩阵索引

假设矩阵是
NxN
square,那么就会有
2N-1
向量;如果我们从
0
2N-2
,向量
n
的元素
k
将位于行
max(n-1-n+k,k)
和列
max(n+k-n+1,k)
(或者相反,行
i
、列
j
的矩阵元素将是向量
min(i,j)
。然后,每当需要访问向量的元素时,只需将坐标从
k,n
转换为
i,j
(即,将向量索引转换为矩阵索引),然后访问矩阵的适当元素。与实际拥有一个向量列表不同,您将得到一个模拟向量列表的东西,从某种意义上说,它可以为您提供列表中任何向量的任何所需元素,这真的很好。(欢迎使用duck打字;-)

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

(非检查代码) 类似于以下内容(java代码):

//假设m是矩阵,那么基本上是一个包含r行和c列的int[][]数组
//m是int[rows][cols];
列表结果=新的ArrayList(行+列-1);
对于(int i=0;i<(行+列-1))
{
int-y;
int x;
如果(i<行)
{
x=0;
y=行-i-1;
}
其他的
{
x=i-行+1;
y=0;
}
向量v=新向量();
while(y
编辑:我把x和y弄混了,现在更正。

Mathematica:

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}}
当然,使用内置的
对角线
函数是一种欺骗。下面是从头开始的
对角线
实现:

(* 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]]

返回
{2,4,6,8,10}

建议:再次使用ArrayList而不是循环中的向量。(同样,可以使用泛型和自动装箱将其更新为现代Java)@David:我会使用ArrayList,但orig的帖子讨论的是向量:)而且(仍然)不是每个人都使用Java1.5+
(* 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[2*i, {i, 1, 5}]