簡體   English   中英

Cula的“ culaSgesv”答案在哪里?

[英]where is cula “culaSgesv” answer for X?

我剛剛下載了Cula,我想使用它的已實現函數來求解線性方程組,我查看了示例目錄,然后看到了下面的代碼,但是當他們想要獲得A * X = B的X解時,他們只是將B復制到其中,這非常令人困惑X,由於A是單位對角矩陣,所以答案為IS,“ B”,在這一行代碼中沒有任何反應

status = culaSgesv(N, NRHS, A, N, IPIV, X, N);

(將X更改為B並沒有幫助!)

你能告訴我發生了什么嗎? 請告訴我如何從中得到答案“ X”?

如果有人需要任何進一步的信息,請告訴我。

#ifdef CULA_PREMIUM
void culaDoubleExample()
{
#ifdef NDEBUG
int N = 4096;
#else
int N = 780;
#endif
int NRHS = 1;
int i;

culaStatus status;

culaDouble* A = NULL;
culaDouble* B = NULL;
culaDouble* X = NULL;
culaInt* IPIV = NULL;

culaDouble one = 1.0;
culaDouble thresh = 1e-6;
culaDouble diff;

printf("-------------------\n");
printf("       DGESV\n");
printf("-------------------\n");

printf("Allocating Matrices\n");
A = (culaDouble*)malloc(N*N*sizeof(culaDouble));
B = (culaDouble*)malloc(N*sizeof(culaDouble));
X = (culaDouble*)malloc(N*sizeof(culaDouble));
IPIV = (culaInt*)malloc(N*sizeof(culaInt));
if(!A || !B || !IPIV)
    exit(EXIT_FAILURE);

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

// Set A to the identity matrix
memset(A, 0, N*N*sizeof(culaDouble));
for(i = 0; i < N; ++i)
    A[i*N+i] = one;

// Set B to a random matrix (see note at top)
for(i = 0; i < N; ++i)
    B[i] = (culaDouble)rand();
memcpy(X, B, N*sizeof(culaDouble));

memset(IPIV, 0, N*sizeof(culaInt));

printf("Calling culaDgesv\n");
DWORD dw1 = GetTickCount();
status = culaDgesv(N, NRHS, A, N, IPIV, X, N);

DWORD dw2 = GetTickCount();
cout<<"Time difference is "<<(dw2-dw1)<<" milliSeconds"<<endl;
if(status == culaInsufficientComputeCapability)
{
    printf("No Double precision support available, skipping example\n");
    free(A);
    free(B);
    free(IPIV);
    culaShutdown();
    return;
}
checkStatus(status);

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

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

free(A);
free(B);
free(IPIV);
}

您提到了Sgesv但是顯示的示例代碼是針對Dgesv 然而,答案是相同的。

根據Netlib LAPACK參考 ,將RHS向量的B矩陣作為第六個參數傳遞給函數:

[進,出] B

      B is DOUBLE PRECISION array, dimension (LDB,NRHS)
      On entry, the N-by-NRHS matrix of right hand side matrix B.
      On exit, if INFO = 0, the N-by-NRHS solution matrix X. 

X矩陣在相同的參數位置返回。 因此,當B傳遞給函數時,它包含NxNRHS右側向量,並且相同的參數返回X結果。

在您顯示的代碼中,他們實際上傳遞了一個名為X的變量,並在返回結果后(在同一變量X )將它們與一個名為B的變量進行比較,這可能會令人困惑,但是概念是相同的。

由於示例中的A矩陣是單位矩陣,因此Ax = b的正確解是x=b

對於一般情況,應在第6個參數位置傳遞RHS向量的B矩陣。 函數完成后,結果( X )將以相同的參數返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM