/**
* 像素消元获取定标系数
*/
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;
}