我面临一个有关如何将给定对称矩阵(它是距离矩阵)的下三角因子存储到向量中的问题。
通常,我只想通过在矩形网格上给出一组点的坐标(Y,Z)来直接生成较低的三角形条目:实际上,这是我被严重卡住的地方。
因此,我开始考虑从稍有不同的角度来解决该问题:生成完整的距离矩阵(再次给出(Y,Z)对),然后对距离矩阵进行矢量化处理。
尽管如此,我对如何通过for循环实现目标并没有真正的想法。
此外,我还知道可能有任何实现vech函数的外部Java库: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 }
最后一句话; 你都尝试了些什么?
@OliCharlesworth:我已经尝试了几次for循环,但是没有成功,我将编辑我的问题,包括我的试用。
我建议交换您的问题-首先询问如何使用标准的for循环来执行此操作,然后提及您还想了解一个库,否则该问题倾向于不具有建设性。
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]
如果我想以column-major方式访问v元素?
行主要和列主要之间的区别是[i][j]? [j][i]或主对角线中的镜像。
所有这些包装还有另外一件有趣的事情。您还可以定义一个映射算法,以将对称矩阵中的(i, j)位子转换为平坦数组中的等效偏移量(就像您描述的那样)。您可以使用算术级数的思想来定义这种映射。我在la4j中处理RandomSymmetricMatrixSource.java类时做到了这一点。因此,您可以使用以下公式(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是对称矩阵的大小。
不错的其他观点。
我想不出能让您做到这一点的库,尽管我确定某个地方有一个库,但是您可以使用如下所示的for循环:
ArrayList> matrix = new ArrayList>();
// add other arraylists to your matrix here i.e.:
ArrayList first = new ArrayList();
first.add(1);
first.add(2);
first.add(3);
ArrayList second = new ArrayList();
second.add(4);
second.add(5);
second.add(6);
ArrayList third = new ArrayList();
third.add(7);
third.add(8);
third.add(9);
matrix.add(first);
matrix.add(second);
matrix.add(third);
ArrayList finalArray = new ArrayList();
for(int i=0; i
{
ArrayList inner = matrix.get(i);
for(int j=0; j
{
finalArray.add(inner.get(j));
}
}
这给出:matrix=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]和finalArray=[1, 4, 5, 7, 8, 9]
当然,这是假设您的矩阵是使用arraylists结构的。