2014-02-12 3 views
-1

Я пытаюсь использовать функцию culaSgels для решения Ax = B.cula использование culaSgels - неправильный аргумент?

Я модифицировал системуПодробный пример пакета cula.

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) Изучение справочного руководства, он говорит, что один аргумент до последнего аргумента (ИИ есть), должно быть матрица B но если я использую «B» вместо «A» в качестве параметра, то я не получаю правильную матрицу B.

+0

Почему вы не проходите B до звонка SGELS? Как это может быть когда-либо работать? – talonmies

+0

@talonmies: Хорошо, спасибо! Я пропустил понимание. – George

ответ

0

Хорошо, код требует 3 работы.

1) Изменение А к В, так что culaSgels('N',N,N, NRHS, A, N, B, N);

(я понял, что на выходе Б содержит раствор)

2) Поскольку CULA использует столбец из основных изменений A, B матрицы соответственно.

3) Изменить на:

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

(используйте NHRS и не N, который является тем же самым в этом примере)

Спасибо!