Java构造Symmetric Matrix(对称矩阵)出错,求代码修正方法
如何修改Jama代码生成目标对称矩阵?
先看一下你想要生成的目标矩阵,它是一个三对角对称矩阵:主对角线大部分元素为2,最后一个元素是1;主对角线的上下相邻位置(行和列相差1的元素)为-1,其余位置都是0。你的当前代码逻辑完全偏离了这个生成规则,所以才会得到非对称的错误结果,下面来一步步修正:
你的代码问题分析
- 循环逻辑完全偏离目标:你每次循环都会给
omega1的整行前4列设值(对角线为1,其余为-1),然后累加到omega,这相当于每行被多次无意义的加减,最终得到的数值完全不是你要的三对角矩阵结构。 - 没有保证对称性:对称矩阵要求
matrix[i][j] = matrix[j][i],你的代码只操作了单方向的元素,没有同步处理对称位置的数值。 - 维度不匹配:你创建了5x5的矩阵,但根据你给出的生成步骤,目标是4x4的矩阵,这里应该是笔误。
修改后的代码
import Jama.Matrix; public class mutest { public static void main(String args[]) { // 根据目标矩阵设置维度为4x4,需要5x5的话直接修改n的值即可 int n = 4; Matrix omega = new Matrix(n, n); // 初始化全零矩阵,避免初始值干扰 // 填充主对角线元素 for (int i = 0; i < n; i++) { if (i < n - 1) { omega.set(i, i, 2); // 前n-1个主对角线元素设为2 } else { omega.set(i, i, 1); // 最后一个主对角线元素设为1 } } // 填充相邻的上下对角线元素(同步设置对称位置,保证矩阵对称) for (int i = 0; i < n - 1; i++) { omega.set(i, i + 1, -1); omega.set(i + 1, i, -1); } // 打印最终结果 omega.print(9, 6); } }
代码解释
- 初始化全零矩阵:先创建一个全零的n阶矩阵,避免默认初始值影响最终结果。
- 设置主对角线:按照你的生成步骤,前3个主对角线元素(对应R1-R3)设为2,最后一个(R4)设为1。
- 设置相邻对角线:遍历每一行,给当前行的下一列设为-1,同时给下一行的当前列也设为-1,这样就保证了
matrix[i][i+1]和matrix[i+1][i]数值一致,满足对称矩阵的要求。
运行这段代码后,你会得到和目标完全一致的对称矩阵:
2.000000 -1.000000 0.000000 0.000000 -1.000000 2.000000 -1.000000 0.000000 0.000000 -1.000000 2.000000 -1.000000 0.000000 0.000000 -1.000000 1.000000
如果需要生成5x5的对称矩阵,只需要把n改成5,调整主对角线的规则(比如前4个设为2,最后一个设为1),相邻对角线的遍历逻辑保持不变即可。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

