Java 高斯消元法根据像素获取波数

时间:2025-02-18 07:18:58
  • /**
  • * 像素消元获取定标系数
  • */
  • public static double[] calcCoefficientByGauss(double[] std_pixel) {
  • //标准乙腈的5个波数
  • double[] stdWaveNumber = {378, 918, 1374, 2252, 2942};
  • double[] coefficient = new double[std_pixel.length];
  • double d;
  • int n = std_pixel.length;//波峰数
  • // 生成n行n+1列二位零矩阵。构造满足唯一解形式的增广矩阵
  • double[][] a = new double[n][n + 1];
  • int i, j, k;
  • for (i = 0; i < n; i++) {
  • for (j = 0; j < n; j++) {
  • a[i][j] = (std_pixel[i], j);
  • }
  • // 波数转波长
  • a[i][n] = waveNumberToWavelength(stdWaveNumber[i]);
  • }
  • //消元。判断每一行是否有主元,如果没有则交换行。形成回代阶梯矩阵(上三角阵)
  • for (k = 0; k < n; k++) {
  • // 选择主元素
  • int l = mainElement(a, k, n);
  • //交换l和k
  • if (l != k) {
  • double t;
  • for (j = k; j <= n; j++) {
  • t = a[k][j];
  • a[k][j] = a[l][j];
  • a[l][j] = t;
  • }
  • }
  • d = a[k][k];
  • for (j = k; j <= n; j++) {
  • a[k][j] = a[k][j] / d;
  • }
  • for (i = k + 1; i < n; i++) {
  • d = a[i][k];
  • for (j = k; j <= n; j++) {
  • a[i][j] = a[i][j] - d * a[k][j];
  • }
  • }
  • }
  • //回代
  • for (i = n - 1; i >= 0; i--) {
  • coefficient[i] = a[i][n];
  • for (j = i + 1; j < n; j++) {
  • coefficient[i] = coefficient[i] - a[i][j] * coefficient[j];
  • }
  • }
  • return coefficient;
  • }