मैं LAPACKE पैकेज का उपयोग कर सी ++ में एक जटिल मैट्रिक्स को उलटने की कोशिश कर रहा हूं। मेरा कोड इस प्रकार है:

void inv(std::vector<std::vector<std::complex<double>>> &ans, std::vector<std::vector<std::complex<double>>> MAT){
    int N = MAT.size();
    int *IPIV = new int[N];
    std::complex<double> ** arr = new std::complex<double>*[N];
    for (int i = 0; i<N; i++){
        arr[i] = new std::complex<double>[N];
        for (int j = 0; j<N; j++){
            arr[i][j] = MAT[i][j];
        }
    }

    LAPACKE_cgetrf(LAPACK_ROW_MAJOR, N, N, arr[0], N, IPIV); 
    LAPACKE_cgetri(LAPACK_ROW_MAJOR, N, arr[0], N, IPIV);
    for (int i = 0; i<N; i++){
        for (int j = 0; j<N; j++){                                                                                                                                                      
            ans[i][j] = arr[i][j];                                                                                                                                                  
        }                                                                                                                                                                       
    }                                                                                                                                                                                                                                                                                                                                                       
    delete IPIV;                                                                                                                                                                
    delete arr;                                                                                                                                                             
}

जो एक त्रुटि देता है:

utils.cc:253:59: error: cannot convert 'std::complex<double>*' to '__complex__ 
float*' for argument '4' to 'int LAPACKE_cgetrf(int, int, int, __complex__ float*, 
int, int* '                                                                                                                                                                                
LAPACKE_cgetrf(LAPACK_ROW_MAJOR, N, N, arr[0], N, IPIV);                                                                                                                                                                          ^                                                                                                                
utils.cc:254:56: error: cannot convert 'std::complex<double>*' to '__complex__ 
float*' for argument '3' to 'int LAPACKE_cgetri(int, int, __complex__ float*, int, 
const int*)'                                                                                                                                                                               
LAPACKE_cgetri(LAPACK_ROW_MAJOR, N, arr[0], N, IPIV);      

मैंने करने की कोशिश की:

__complex__ float ** arr = new __complex__ float *[N];                                                                                                                      
for (int i = 0; i<N; i++){                                                                                                                                                      
    arr[i] = new __complex__ float [N];                                                                                                                                         
    for (int j = 0; j<N; j++){                                                                                                                                                      
        arr[i][j] = reinterpret_cast<float(&)[2]>(MAT[i][j]);                                                                                                                   
    }                                                                                                                                                                       
}   

फ़ंक्शन में पहले लूप के लिए, लेकिन यह देता है:

 error: cannot convert 'float [2]' to '__complex__ float' in assignment                                                                                                  
 arr[i][j] = reinterpret_cast<float(&)[2]>(MAT[i][j]);   

मैं क्या गलत कर रहा हूं? मेरे पास एक और आमंत्रण फ़ंक्शन है जो युगल के साथ ठीक काम करता है। यह जटिल प्रकार हैं जिनसे मुझे परेशानी हो रही है।

धन्यवाद

1
Imran Alkhatib 21 जिंदा 2020, 20:50

1 उत्तर

सबसे बढ़िया उत्तर

LAPACK निरंतर डेटा ब्लॉक की अपेक्षा कर सकता है। पंक्तियों के साथ

void inv(std::vector<std::vector<std::complex<double>>> &ans, std::vector<std::vector<std::complex<double>>> MAT){
    using cfloat = __complex__ float;
    int N = MAT.size();

    cfloat* arr = new cfloat [N*N];
    for (int i = 0; i != N; ++i) {            
        for (int j = 0; j != N; ++j){
            int idx = i*N + j;
            arr[idx] = (MAT[i][j]).real() + _Complex_I*(MAT[i][j]).imag();
        }
    }

    int* IPIV = new int[N];

    LAPACKE_cgetrf(LAPACK_ROW_MAJOR, N, N, arr, N, IPIV); 
    LAPACKE_cgetri(LAPACK_ROW_MAJOR, N, arr, N, IPIV);
    for (int i = 0; i != N; ++i){
        for (int j = 0; j != N; ++j){
            int idx = i*N + j;
            ans[i][j] = arr[idx];                                                                                                 
        }                                                                                                                                                                       
    }                                                                                                                                                                                                                                                                                                                                                       
    delete [] IPIV;                                                                                                                                                                
    delete [] arr;                                                                                                                                                             
}
0
Severin Pappadeux 21 जिंदा 2020, 21:51