আমি অন্য কয়েকটি উত্তরগুলির সাথে একমত নই এবং বলব যে আমি বিশ্বাস করি যে বৈজ্ঞানিক কম্পিউটিংয়ের ক্ষেত্রে কীভাবে ল্যাপ্যাক ব্যবহার করবেন তা নির্ধারণ করা গুরুত্বপূর্ণ।
তবে ল্যাপাক ব্যবহারের জন্য একটি বৃহত শিক্ষার বক্ররেখা রয়েছে। এটি খুব নিম্ন স্তরে লেখা হয়েছে কারণ এটি। এর অসুবিধাটি হ'ল এটি অত্যন্ত গুপ্ত এবং ইন্দ্রিয়গুলির কাছে সুখকর নয়। এর সুবিধাটি হ'ল ইন্টারফেসটি দ্ব্যর্থহীন এবং মূলত কখনই পরিবর্তন হয় না। অতিরিক্তভাবে, ল্যাপাকের বাস্তবায়ন যেমন ইন্টেল ম্যাথ কার্নেল লাইব্রেরিটি সত্যিই দ্রুত।
আমার নিজের উদ্দেশ্যে, আমার নিজস্ব উচ্চ স্তরের সি ++ ক্লাস রয়েছে যা ল্যাপাক সাবউরাইনগুলিকে প্রায় আবৃত করে। অনেকগুলি বৈজ্ঞানিক গ্রন্থাগার নীচে ল্যাপাক ব্যবহার করে। কখনও কখনও কেবল সেগুলি ব্যবহার করা সহজ তবে আমার মতে নীচের সরঞ্জামটি বোঝার অনেক মূল্য আছে। সে লক্ষ্যে, আমি আপনাকে শুরু করতে ল্যাপাক ব্যবহার করে সি ++ তে লিখিত একটি ছোট্ট কাজের উদাহরণ সরবরাহ করেছি। এটি উবুন্টুতে 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 )
মন্তব্যসমূহ:
- আপনি ল্যাপাকের নামকরণের স্কিমটি ফেলে দিয়েছেন বলে মনে হচ্ছে। একটি সংক্ষিপ্ত বিবরণ এখানে ।
- ডিজিইভি সাবউরোটিনের ইন্টারফেসটি এখানে । আপনার এখানে যুক্তিগুলির বিবরণটি তুলনা করতে সক্ষম হওয়া উচিত।
extern "C"
উপরের অংশটি নোট করুন এবং আমি এতে একটি আন্ডারস্কোর যুক্ত করেছি dgeev_
। কারণ লাইব্রেরিটি ফোর্টরানে রচিত এবং নির্মিত হয়েছিল, সুতরাং সংযোগের সময় প্রতীকগুলি মেলাতে এটি প্রয়োজনীয়। এটি সংকলক এবং সিস্টেম নির্ভর, সুতরাং আপনি যদি এটি উইন্ডোতে ব্যবহার করেন তবে এটি সমস্ত পরিবর্তন করতে হবে।
- কিছু লোক LAPACK এ সি ইন্টারফেস ব্যবহার করার পরামর্শ দিতে পারে । এগুলি সঠিক হতে পারে তবে আমি সর্বদা এটি এইভাবে করেছি।