gpt4 book ai didi

java - 在 Java 中查找复杂矩阵的 SVD 矩阵

转载 作者:行者123 更新时间:2023-11-30 12:07:32 27 4
gpt4 key购买 nike

我目前正在从事音频信号处理项目,需要在 Java 中的复杂矩阵上使用 SVD。我当前的线性代数库是 Apache Commons。但是,它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复数SVD。

我一直在使用一些技巧从等效实矩阵中找到 SVD,使用发现的技术 here .但是,当我重建矩阵时,该技术在虚部方面存在相当大的不准确性。

如果有人可以使用真正的 SVD 库或支持 java 中的复杂 SVD 的库找到复杂的 SVD,我将不胜感激。


这是我一直以来的做法:

    //Array2DRowFieldMatrix<Complex> A = some matrix defined earlier
Array2DRowRealMatrix AA = new Array2DRowRealMatrix(2 * row, 2 * col);
Complex Aentry;

for (int c = 0; c < row; c++) {
for (int s = 0; s < col; s++) {
Aentry = A.getEntry(c, s);

AA.setEntry(c, s, Aentry.getReal());
AA.setEntry(c, col + s, -Aentry.getImaginary());
AA.setEntry(row + c, s, Aentry.getImaginary());
AA.setEntry(row + c, col + s, Aentry.getReal());
}
}

Array2DRowRealMatrix UU, SS, VV;

svd = new SingularValueDecomposition(AA);

UU = (Array2DRowRealMatrix) svd.getU();
SS = (Array2DRowRealMatrix) svd.getS();
VV = (Array2DRowRealMatrix) svd.getV();

double[][] tempU = new double[row][2 * row];
double[][] tempV = new double[col][2 * row];
double[] tempS = new double[row];

Array2DRowFieldMatrix<Complex> U = new Array2DRowFieldMatrix<>(ComplexField.getInstance(), row, row);
Array2DRowFieldMatrix<Complex> S = new Array2DRowFieldMatrix<>(ComplexField.getInstance(), row, row);
Array2DRowFieldMatrix<Complex> V = new Array2DRowFieldMatrix<>(ComplexField.getInstance(), col, row);
Array2DRowFieldMatrix<Complex> recon, diff;

UU.copySubMatrix(row, 2 * row - 1, 0, 2 * row - 1, tempU);
VV.copySubMatrix(col, 2 * col - 1, 0, 2 * row - 1, tempV);

for (int i = 0; i < row; i++) {
for (int j = 0; j < row; j++) {
U.setEntry(i, j, new Complex(tempU[i][2 * j], tempU[i][2 * j + 1]));
}
}

for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
V.setEntry(i, j, new Complex(tempV[i][2 * j], tempV[i][2 * j + 1]));
}
}

for (int i = 0; i < row; i++) {
tempS[i] = SS.getEntry(i * row, i * row);
if (tempS[i] == 0) {
tempS[i] = EPSILON;
}
}

for (int i = 0; i < row; i++) {
for (int j = 0; j < row; j++) {
if (i != j) {
S.setEntry(i, j, Complex.ZERO);
}
}

S.setEntry(i, i, new Complex(tempS[i]));
}

recon = (Array2DRowFieldMatrix<Complex>)U.multiply(S).multiply(conjugate(V).transpose());

最佳答案

如果您可以使用 native 库,那么 jeigen是一个选项

关于java - 在 Java 中查找复杂矩阵的 SVD 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54844202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com