2014-02-12 22 views
-1

我正在嘗試使用culaSgels函數來解析Ax = B。cula使用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有),應該是矩陣B存儲columnwised,但如果我使用「B」而不是「A」作爲參數,那麼我沒有得到正確的B矩陣。

+0

你爲什麼不把B傳給SGELS電話?這*可能*如何工作? – talonmies

+0

@talonmies:好的,謝謝!我錯過了理解。 – George

回答

0

好的,代碼需要3件事情才能工作。

1)改變A到B,所以culaSgels('N',N,N, NRHS, A, N, B, N);

(I誤解,在出口B包含溶液)

2)由於使用CULA柱重大改變A,B相應矩陣。

3)更改爲:

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

(使用NHRS和不爲N,其在本例中是相同的)

謝謝!