-1

Ax=B を解くために culaSgels 関数を使用しようとしています。

cula パッケージの systemSolve の例を修正しました。

void culaFloatExample()
{
    int N=2;
    int NRHS = 2;
    int i,j;

    double cula_time,start_time,end_time;

    culaStatus status;

    culaFloat* A = NULL;
    culaFloat* B = NULL;
    culaFloat* X = NULL;

    culaFloat one = 1.0f;
    culaFloat thresh = 1e-6f;
    culaFloat diff;

    printf("Allocating Matrices\n");
    A = (culaFloat*)malloc(N*N*sizeof(culaFloat));
    B = (culaFloat*)malloc(N*N*sizeof(culaFloat));
    X = (culaFloat*)malloc(N*N*sizeof(culaFloat));

    if(!A || !B )
        exit(EXIT_FAILURE);

    printf("Initializing CULA\n");
    status = culaInitialize();
    checkStatus(status);

    // Set A
    A[0]=1;
    A[1]=2;
    A[2]=3;
    A[3]=4;

    // Set B 
    B[0]=5;
    B[1]=6;
    B[2]=2;
    B[3]=3;

    printf("Calling culaSgels\n");
    // Run CULA's version
    start_time = getHighResolutionTime();

    status = culaSgels('N',N,N, NRHS, A, N, A, N);

    end_time = getHighResolutionTime();
    cula_time = end_time - start_time;
    checkStatus(status);

    printf("Verifying Result\n");
    for(i = 0; i < N; ++i){
    for (j=0;j<N;j++)
    {
        diff = X[i+j*N] - B[i+j*N];
        if(diff < 0.0f)
            diff = -diff;
        if(diff > thresh)
            printf("\nResult check failed:  X[%d]=%f  B[%d]=%f\n", i, X[i+j*N],i, B[i+j*N]);

     printf("\nResults:X= %f \t B= %f:\n",X[i+j*N],B[i+j*N]);
    }
}


    printRuntime(cula_time);
    printf("Shutting down CULA\n\n");
    culaShutdown();

    free(A);
    free(B);

}

私はculaSgels('N',N,N, NRHS, A, N, A, N);システムを解決するために使用していますが:

1) 結果は、 X=0 のすべての要素が B が正しいことを示しています。また、それは私に

結果チェック失敗メッセージ

2)リファレンスマニュアルを調べると、最後の引数(AIが持っている)の前の1つの引数は、列ごとに格納された行列Bである必要がありますが、「A」の代わりに「B」をパラメータとして使用すると、得られません正しい B 行列。

4

1 に答える 1

0

OK、コードが機能するには 3 つのことが必要です。

1) A を B に変更するので、culaSgels('N',N,N, NRHS, A, N, B, N);

(出口Bに解決策があると勘違いしていました)

2) CULA は、それに応じて列の主要な変更 A、B 行列を使用するためです。

3) に変更:

B = (culaFloat*)malloc(N*NRHS*sizeof(culaFloat));
X = (culaFloat*)malloc(N*NRHS*sizeof(culaFloat));

(この例では同じ N ではなく NHRS を使用します)

ありがとう!

于 2014-02-12T11:05:09.420 に答える