我可以 return 在 Java 中的一个方法(LDL^T Factroization)中同时使用两种数组类型吗

Can I return two array types at the same time in a single method (LDL^T Factroization) in Java

我在java中写了这个用于LDL^T分解的方法(它将对称方阵"A"分解为3个矩阵,其中"L"是下三角矩阵,其中1s对角线,"D" 是具有正项的对角矩阵,"L^T" 是 L 的转置矩阵)。想知道是否可以用相同的方法 return L 和 D 矩阵,如果不能,我该如何拆分此方法。按照我教科书中的算法(Faires and Douglas 第 9 版第 417 页的数值分析),我的代码仍然有一些我必须弄清楚的逻辑缺陷。所以我的问题 is/are 我可以 return 在同一个方法中同时使用两种不同类型的数组( L[][] 和 D[] 所以 D 只有 returns对角线元素作为数组,L return 是整个矩阵 ) and/or 如何拆分此方法。

public static double[][] Lfactor(double[][] A) {
    if (!isSquare(A)) {
        throw new RuntimeException("Matrix is not square");
    }
    if (!isSymmetric(A)) {
        throw new RuntimeException("Matrix is not symmetric");
    }
    int N = A.length;
    double[][] L = new double[N][N];
    double[] V = new double[N];
    double[] D = new double[N];
    for(int i=1; i <= N; i++ ){
        for(int j=1; j<=i-1;j++){
            V[j]= L[i][j]*D[j];
            double Sum1 = 0.0;
             Sum1+= L[i][j] * V[j];
             D[i] = A[i][i] - Sum1;
        for( j=i+1; j<=N;j++){
            for(int k = 1; k<=i-1; k++){
            double Sum2 = 0.0;
            Sum2 += L[j][k]*V[k];
            L[j][i]= (A[j][i] - Sum2)/D[i];
                    }
        }
    }
}
    return L;}

您可以创建一个包含 L 和 D 矩阵作为 class 成员的 class,然后 return 此 class 的一个实例。

使用此方法,您可以将此算法作为一种方法合并到 class 中,并提供单独的方法来检索 L、D 和转置的 L 矩阵。

例如,class 如下:

public class LDLT
{
    private double[][] l;
    private double[][] d;

    public void calculate(double[][] a)
    {
        // calculate, and store in l and d...
    }

    public double[][] getL()
    {
        return l;
    }

    public double[][] getD()
    {
        return d;
    }

    public double[][] getTransposedL()
    {
        // calculate and transpose the l matrix...
    }
}

您只能 return 一个方法中的一个变量。有几种方法可以获得这两个值,但我会这样做的方法是创建一个新的 class 命名为 LDArray,并且 class 将包含两个数组,L 和D,以及两个数组的 getters/setters。这样你就可以简单地将你的方法更改为 return LDArray 和 post 两个数组在一个对象中。

您可以 return 一个 Object 的数组,其中包含 LD,尽管 @Alan 的建议更安全。

不用多想,直接创建一个class(可能是inner),命名为DecompositionResults,给它两个public成员:D和L。然后把计算好的矩阵赋值给a class 和 return 的新对象。

或者,由于 L 在概念上是二维的,而 D 是一维的,因此 return 一个大小为 N+1 x N 的二维数组,其中 last/first 行是 D。

适当的编程语言都有元组类型,非常适合这种用途。但是 Java 没有。所以你可以像这样模拟你自己的对(通常称为二元组):

public static class Tuple<T, U> {
  public final T _1;
  public final U _2;
  public Tuple(T arg1, U arg2) {
    super();
    this._1 = arg1;
    this._2 = arg2;
  }
}

并将其用作 return 值。

您可以将代码放在结果中 class。

class LFactor {
    public final double[] L[], V, D;

    public LFactor(double[][] A) {
        if (!isSquare(A)) {
            throw new RuntimeException("Matrix is not square");
        }
        if (!isSymmetric(A)) {
            throw new RuntimeException("Matrix is not symmetric");
        }
        int N = A.length;
        L = new double[N][N];
        V = new double[N];
        D = new double[N];
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= i - 1; j++) {
                V[j] = L[i][j] * D[j];
                double Sum1 = 0.0;
                Sum1 += L[i][j] * V[j];
                D[i] = A[i][i] - Sum1;
                for (j = i + 1; j <= N; j++) {
                    for (int k = 1; k <= i - 1; k++) {
                        double Sum2 = 0.0;
                        Sum2 += L[j][k] * V[k];
                        L[j][i] = (A[j][i] - Sum2) / D[i];
                    }
                }
            }
        }
    }
}

顺便说一句

double Sum1 = 0.0;
Sum1 += L[i][j] * V[j];
D[i] = A[i][i] - Sum1;

相同
D[i] = A[i][i] - L[i][j] * V[j];

这是你想要的吗?

此外,如果您使用

,您的循环可能会更简单
for (int i = 0; i < N; i++) {

因为这是索引的范围。