ऐप्पल 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;
}
विहित LAPACK संदर्भ LAPACK उपयोग है आर गाइड है। (http://www.netlib.org/lapack/lug/) –
मुझे इस गुप्त (स्कैनिंग कम से कम) लाइब्रेरी को स्कैन करने में समस्या हो रही है जो LAPACK है। मैं इस कोड को एकल परिशुद्धता फ्लोट में कैसे अनुकूलित कर सकता हूं? –
ओह, मैंने पाया: sgetrf_ और sgetri_ ("एकल परिशुद्धता" के लिए एस?) –