मैं कुछ अन्य उत्तरों से असहमत होने जा रहा हूं और कहता हूं कि मेरा मानना है कि वैज्ञानिक कंप्यूटिंग के क्षेत्र में LAPACK का उपयोग कैसे किया जाए यह महत्वपूर्ण है।
हालांकि, लैपैक का उपयोग करने के लिए एक बड़ा सीखने की अवस्था है। ऐसा इसलिए है क्योंकि यह बहुत निचले स्तर पर लिखा गया है। इसका नुकसान यह है कि यह बहुत ही गूढ़ लगता है, और इंद्रियों के लिए सुखद नहीं है। इसका लाभ यह है कि इंटरफ़ेस अस्पष्ट है और मूल रूप से कभी नहीं बदलता है। इसके अतिरिक्त, LAPACK के कार्यान्वयन, जैसे कि इंटेल मठ कर्नेल लाइब्रेरी वास्तव में तेज़ हैं।
अपने स्वयं के प्रयोजनों के लिए, मेरे पास अपने उच्च स्तर के C ++ वर्ग हैं जो LAPACK सबरूटीन के चारों ओर लपेटते हैं। कई वैज्ञानिक पुस्तकालय भी नीचे की ओर LAPACK का उपयोग करते हैं। कभी-कभी उनका उपयोग करना आसान होता है, लेकिन मेरे विचार में उपकरण को समझने में बहुत अधिक मूल्य है। उस अंत तक, मैंने आपको शुरू करने के लिए LAPACK का उपयोग करते हुए C ++ में लिखा एक छोटा सा कार्य उदाहरण प्रदान किया है। यह उबंटू में liblapack3
स्थापित पैकेज के साथ काम करता है , और भवन के लिए अन्य आवश्यक पैकेज। इसका उपयोग संभवतः अधिकांश लिनक्स वितरण में किया जा सकता है, लेकिन लैपैक की स्थापना और इसके खिलाफ लिंक करना अलग-अलग हो सकता है।
यहाँ फ़ाइल है test_lapack.cpp
#include <iostream>
#include <fstream>
using namespace std;
// dgeev_ is a symbol in the LAPACK library files
extern "C" {
extern int dgeev_(char*,char*,int*,double*,int*,double*, double*, double*, int*, double*, int*, double*, int*, int*);
}
int main(int argc, char** argv){
// check for an argument
if (argc<2){
cout << "Usage: " << argv[0] << " " << " filename" << endl;
return -1;
}
int n,m;
double *data;
// read in a text file that contains a real matrix stored in column major format
// but read it into row major format
ifstream fin(argv[1]);
if (!fin.is_open()){
cout << "Failed to open " << argv[1] << endl;
return -1;
}
fin >> n >> m; // n is the number of rows, m the number of columns
data = new double[n*m];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
fin >> data[j*n+i];
}
}
if (fin.fail() || fin.eof()){
cout << "Error while reading " << argv[1] << endl;
return -1;
}
fin.close();
// check that matrix is square
if (n != m){
cout << "Matrix is not square" <<endl;
return -1;
}
// allocate data
char Nchar='N';
double *eigReal=new double[n];
double *eigImag=new double[n];
double *vl,*vr;
int one=1;
int lwork=6*n;
double *work=new double[lwork];
int info;
// calculate eigenvalues using the DGEEV subroutine
dgeev_(&Nchar,&Nchar,&n,data,&n,eigReal,eigImag,
vl,&one,vr,&one,
work,&lwork,&info);
// check for errors
if (info!=0){
cout << "Error: dgeev returned error code " << info << endl;
return -1;
}
// output eigenvalues to stdout
cout << "--- Eigenvalues ---" << endl;
for (int i=0;i<n;i++){
cout << "( " << eigReal[i] << " , " << eigImag[i] << " )\n";
}
cout << endl;
// deallocate
delete [] data;
delete [] eigReal;
delete [] eigImag;
delete [] work;
return 0;
}
यह कमांड लाइन का उपयोग करके बनाया जा सकता है
g++ -o test_lapack test_lapack.cpp -llapack
यह एक निष्पादन योग्य नाम का उत्पादन करेगा test_lapack
। मैंने इसे एक टेक्स्ट इनपुट फ़ाइल में पढ़ने के लिए सेट किया है। यहाँ एक फाइल है जिसका नाम matrix.txt
3x3 मैट्रिक्स है।
3 3
-1.0 -8.0 0.0
-1.0 1.0 -5.0
3.0 0.0 2.0
प्रोग्राम को चलाने के लिए बस टाइप करें
./test_lapack matrix.txt
कमांड लाइन पर, और आउटपुट होना चाहिए
--- Eigenvalues ---
( 6.15484 , 0 )
( -2.07742 , 3.50095 )
( -2.07742 , -3.50095 )
टिप्पणियाँ:
- आप LAPACK के लिए नामकरण योजना द्वारा फेंक दिए गए लगते हैं। एक संक्षिप्त विवरण यहाँ है ।
- DGEEV सबरूटीन के लिए इंटरफ़ेस यहाँ है । आपको वहाँ के तर्कों के विवरण की तुलना करने में सक्षम होना चाहिए जो मैंने यहाँ किया है।
extern "C"
शीर्ष पर अनुभाग पर ध्यान दें , और मैंने अंडरस्कोर जोड़ा है dgeev_
। ऐसा इसलिए है क्योंकि पुस्तकालय फोरट्रान में लिखा और बनाया गया था, इसलिए लिंक करते समय प्रतीकों से मेल खाना आवश्यक है। यह कंपाइलर और सिस्टम पर निर्भर है, इसलिए यदि आप विंडोज पर इसका उपयोग करते हैं, तो इसे सभी को बदलना होगा।
- कुछ लोग L इंटरफ़ेस पर C इंटरफ़ेस का उपयोग करने का सुझाव दे सकते हैं । वे सही हो सकते हैं, लेकिन मैंने हमेशा इसे इस तरह से किया है।