2012-07-01 28 views
5

मैं एक मैट्रिक्स के उलटा खोजना चाहता हूं।त्वरित ढांचे का उपयोग कर मैट्रिक्स उलटा ऑपरेशन कैसे करें?

मुझे पता है कि इसमें पहले LU कारक शामिल है तो उलटा कदम है लेकिन मुझे 10.7 के सेब के दस्तावेज़ों को खोजकर आवश्यक फ़ंक्शन नहीं मिल रहा है!

यह एक उपयोगी पोस्ट Symmetric Matrix Inversion in C using CBLAS/LAPACK जैसा लगता है, यह इंगित करता है कि sgetrf_ और sgetri_ फ़ंक्शंस का उपयोग किया जाना चाहिए। हालांकि इन शर्तों को खोजना मुझे एक्सकोड दस्तावेज़ों में कुछ नहीं मिला।

क्या किसी के पास इस मैट्रिक्स ऑपरेशन के लिए बॉयलर प्लेट कोड है?

उत्तर

13

ऐप्पल LAPACK कोड को बिल्कुल दस्तावेज नहीं करता है, मुझे लगता है क्योंकि वे netlib.org से मानक इंटरफ़ेस को लागू करते हैं। यह एक शर्म की बात है कि आप अंतर्निहित एक्सकोड दस्तावेज़ों से इन फ़ंक्शन नामों को नहीं खोज सकते हैं, हालांकि समाधान काफी सीधे आगे है: बस यूआरएल में फ़ंक्शन नाम निर्दिष्ट करें। dgetrf_() के लिए, http://www.netlib.org/clapack/what/double/dgetrf.c पर जाएं।

एक मैट्रिक्स दो LAPACK समारोह को उलटने की आवश्यकता है: dgetrf_(), जो LU गुणनखंड करता है, और dgetri_() जो पिछले फ़ंक्शन के परिणाम लेता है और वास्तविक उलट है।

मैं एक मानक Xcode का उपयोग कर आवेदन परियोजना बनाई, में तेजी लाने फ्रेमवर्क, दो सी फ़ाइलों को बनाने कहा: matinv.h, matinv.c और कोको चीजों को दूर करने के main.m फ़ाइल संपादित:

// main.m 

#import "matinv.h" 

int main(int argc, char *argv[]) 
{ 
    int N = 3; 
    double A[N*N]; 
    A[0] = 1; A[1] = 1; A[2] = 7; 
    A[3] = 1; A[4] = 2; A[5] = 1; 
    A[6] = 1; A[7] = 1; A[8] = 3; 
    matrix_invert(N, A); 
    //  [ -1.25 -1.0 3.25 ] 
    // A^-1 = [ 0.5  1.0 -1.5 ] 
    //  [ 0.25 0.0 -0.25 ] 
    return 0; 
} 

अब प्रवेशिका फ़ाइल,

// matinv.h 

int matrix_invert(int N, double *matrix); 

और उसके बाद स्रोत फ़ाइल,

int matrix_invert(int N, double *matrix) { 

    int error=0; 
    int *pivot = malloc(N*sizeof(int)); // LAPACK requires MIN(M,N), here M==N, so N will do fine. 
    double *workspace = malloc(N*sizeof(double)); 

    /* LU factorisation */ 
    dgetrf_(&N, &N, matrix, &N, pivot, &error); 

    if (error != 0) { 
     NSLog(@"Error 1"); 
     free(pivot); 
     free(workspace); 
     return error; 
    } 

    /* matrix inversion */ 
    dgetri_(&N, matrix, &N, pivot, workspace, &N, &error); 

    if (error != 0) { 
     NSLog(@"Error 2"); 
     free(pivot); 
     free(workspace); 
     return error; 
    } 

    free(pivot); 
    free(workspace); 
    return error; 
} 
+1

विहित LAPACK संदर्भ LAPACK उपयोग है आर गाइड है। (http://www.netlib.org/lapack/lug/) –

+0

मुझे इस गुप्त (स्कैनिंग कम से कम) लाइब्रेरी को स्कैन करने में समस्या हो रही है जो LAPACK है। मैं इस कोड को एकल परिशुद्धता फ्लोट में कैसे अनुकूलित कर सकता हूं? –

+0

ओह, मैंने पाया: sgetrf_ और sgetri_ ("एकल परिशुद्धता" के लिए एस?) –