java生成对称矩阵_关于Java:对称矩阵半向量化

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

通常,我只想通过在矩形网格上给出一组点的坐标(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结构的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值