0

我面临一个关于如何将给定对称矩阵(它是距离矩阵)的下三角因子存储到向量中的问题。

一般来说,我想通过只给出(Y,Z)矩形网格上一组点的坐标来直接生成下三角形条目:实际上这是我被卡住的地方。

所以,我开始考虑从一个稍微不同的角度来解决这个问题:生成完整的距离矩阵(再次给定对(Y,Z)),然后对距离矩阵进行半向量化。

尽管如此,我对如何通过for循环实现目标并没有真正的想法。

此外,我还知道可能有任何Java实现该vech功能的外部库:vech返回通过消除方阵的所有超对角元素X并将结果堆叠在另一列之上而获得的向量。这在矩阵微积分中使用,其中基础矩阵是对称的,将值保持在主对角线之上是没有意义的。

基本上,给定一个矩阵A = {{a,c},{b,d}},通过应用vech(A),结果将是 vech(A) = {a,b,d}

编辑

我的意思是这样的:

    a11 a12 a13 a14
        a22 a23 a24
 A=         a33 a34  (aij = aji)
                a44

上三角的打包存储A

  AP = { a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 }
4

3 回答 3

2
public static double[] vech(double[][] a) {
    int na = Math.min(a.length, a[0].length); // Dimension of the matrix
    int nv = na * (na + 1) / 2; // 1 + 2 + 3 + .. + na
    double[] v = new double[nv];
    int k = 0; // index in v.
    for (int i = 0; i < na; ++i) {
        for (int j = 0; j <= i; ++j) {
            v[k] = a[i][j];
            ++k;
        }
    }
    return v;
}

案例 2x2 矩阵:

选择 [0][0]、[1][0]、[1][1](跳过 [0][1])

行主要顺序:(C, C#, Java) a[i][j] 是第 i 行第 j 列的元素。

代码使左下角的三角形变平。

列主要顺序: (MATLAB, SciLab) a[i][j] 是第 i 列第 j 行的元素。

代码使右上角的三角形变平。

其他序列

另一个三角形将被给出为:

        for (int j = i; j < na; ++j) {

结合主对角线中的镜像,再次接收原始三角形:

            a[j][i]
于 2013-06-04T09:21:37.873 回答
1

所有这些包装还有另一个有趣的事情。您还可以定义映射算法以将(i, j)对称矩阵中的位置转换为展平数组中的等效偏移量(就像您描述的那样)。您可以使用算术级数的思想来定义这种映射。我在处理 la4j 中的RandomSymmetricMatrixSource.java类时这样做了。因此,您可以使用这些公式(它不处理 when 的情况i == j):

int flatten(int i, int j) {
  int offset = -1;

  if (i < j) {
    offset = j - (i + 1) + (int)((((size - 1) + (size - i)) / 2.0) * i);
  } else {
    offset = i - (j + 1) + (int)((((size - 1) + (size - j)) / 2.0) * j);
  }

  return offset;
}

,其中size是对称矩阵的大小。

于 2013-06-06T06:02:57.277 回答
0

我想不出一个库可以让你这样做,虽然我确信某处有一个,但你可以使用如下的 for 循环:

ArrayList<ArrayList<int>> matrix = new ArrayList<ArrayList<int>>();
// add other arraylists to your matrix here i.e.:

ArrayList<Integer> first = new ArrayList<Integer>();
first.add(1);
first.add(2);
first.add(3);

ArrayList<Integer> second = new ArrayList<Integer>();
second.add(4);
second.add(5);
second.add(6);

ArrayList<Integer> third = new ArrayList<Integer>();
third.add(7);
third.add(8);
third.add(9);

matrix.add(first);
matrix.add(second);
matrix.add(third);

ArrayList<int> finalArray = new ArrayList<int>();

for(int i=0; i<matrix.size(); i++)
{
    ArrayList<Integer> inner = matrix.get(i);
    for(int j=0; j<i+1; j++)
    {
        finalArray.add(inner.get(j));
    }
}   

这给出了:matrix=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]finalArray=[1, 4, 5, 7, 8, 9]

当然,这是假设您的矩阵是使用数组列表构造的。

于 2013-06-04T09:21:58.687 回答