2

Jama と svd() メソッドを使用して、スレッドを使用して行列 A から行列 U、S、および V にアクセスする小さなコードを書いていますが、Java Null ポインタ例外などの問題に直面しています。私のコードはこれです:

public class SVD implements Runnable
    {
    private Thread t;
    public Matrix A;
    public int option;
    public Matrix result;

    public SVD(Matrix A, int optiune)
    {
        this.A = A;
        this.option = optiune;
    }

    @Override
    public void run()
    {
        if (option == 1)
            result = A.svd().getU();
        if(option ==2)
            result=A.svd().getS();
        if(option ==3)
            result=A.svd().getV();
    }

    public void start()
    {
        if (t == null)
        {
            t = new Thread(this);
            t.start();
        }

    }

}

今、次のような 3 つの SVD オブジェクトを作成しようとすると:

 Matrix A = Matrix.random(20, 20);
    SVD a1 = new SVD(A, 1);
    SVD a2 = new SVD(A, 2);
    SVD a3 = new SVD(A, 3);
    a1.start();
    a2.start();
    a3.start();
    Matrix U=a1.result;

最後の行は、エラーを取得する行です。問題の原因は何ですか? それは私が逃したものですか?

PS: 書式設定については申し訳ありませんが、なぜそれが行われるのかわかりません!

4

1 に答える 1

0

結果はタイプ Matrix からのものですが、a1 は何かを指していますが、a1.result は null である可能性があります。最後の行を実行する前に run メソッドを呼び出してみてください。

Matrix A = Matrix.random(20, 20);
SVD a1 = new SVD(A, 1);
SVD a2 = new SVD(A, 2);
SVD a3 = new SVD(A, 3);
a1.start();
a2.start();
a3.start();
a1.run();
Matrix U=a1.result;

a1.run() の行を確認してください。これは、a1 からの結果フィールドを初期化するためです。

于 2016-01-26T20:02:30.573 に答える