2014-02-12 5 views
-1

Ax = B를 풀기 위해 culaSgels 함수를 사용하려고합니다.culaSgels의 cula 사용 - 잘못된 인수입니까?

나는 cula 패키지의 systemSolve 예제를 수정했습니다. I 시스템을 해결하되 culaSgels('N',N,N, NRHS, A, N, A, N); 사용하고

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); 

} 

:이

1) 결과는 X = 0, 그러나 B의 모든 요소가 적합한 저를 도시한다. 또한 는, 그것이 하나 개의 인수의 마지막 인수하기 전에 (인공 지능이있다), 행렬 B해야한다고 말한다는

결과 확인 메시지

2) 참조 매뉴얼을 공부 실패 나에게 보여줍니다 하지만 "B"대신 "A"를 매개 변수로 사용하면 올바른 B 행렬을 얻지 못합니다.

+0

SGELS 호출에 B를 전달하지 않는 이유는 무엇입니까? 어떻게 * 가능한 * 작동 할 수 있습니까? – talonmies

+0

@ talonmies : 감사합니다. 나는 잘못 이해했다. – George

답변

0

코드가 작동하려면 3 가지가 필요합니다.

1) B로 변경 (A)는, 매우 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을 사용!