VC++6.0使用MATCOM矩陣庫的方法
最近在做一個專案,甲方要求使用VC6.0來做,(都什麼年代了還在用vc6.0,無力吐槽,奈何甲方就是甲方),專案中設計到很多矩陣運算,並且要在原來的研究成果上來做,原來的成果大部分都是用Matlab實現的,這就需要一個轉化。
對比了一大波矩陣庫(1.C++矩陣運算庫:matcom 2.C++矩陣運算庫:Eigen3 3.C++矩陣運算庫:OpenCV 4.C++矩陣運算庫:ViennaCL 5.C++矩陣運算庫:Armadillo)最後才發現好像只有Matcom支援vc6.0,並且已經被matlab收購,只能去扒拉老版本的拿來用。下面介紹一下使用流程吧
1.修復VC6.0bug
第一步:將filetool.dll檔案拷貝到vc安裝目錄下(安裝目錄下有個vc98資料夾,放到該資料夾裡就行)。
第二步:執行任意一個vc6.0工程專案,通過Tools(工具)->Customize(訂製)->Add-ins And Macro Files(附加項和巨集檔案),點選“瀏覽”將剛才複製vc98資料夾裡的DLL新增進去。這是就多了一個工具欄如圖 vc6.0無法使用“新增到工程”解決方法,“A”表示“新增”、“O”表示“開啟”。以後就可以通過點選“A”把檔案新增到工程了。
2.建立一個c++工程
第一步:首先,建立一個新的c++工程。我們喜歡在程式中使用printf等函式向計算機螢幕上輸出一些內容,所以我們新建的工程是控制檯模式的。需要強調的是Matrix在owl,mfc或是Actives控制元件等程式的開發中也能發揮它的強大效率。
VC下建立新工程:VC->file>new>Win32Console Application,選擇空專案
第二步:新增矩陣庫到工程
將v4501.lib、matlib.h、ago4501.dll、v4501v.dll檔案放到專案根目錄,點選“A” 找到v4501v.lib並新增,
第三步:建立新的原始檔
在該工程目錄下建立一個新的原始檔,命名為main.cpp,複製必備檔案中main.cpp中的程式碼過來,執行,不報錯就ok了;
VC:選單目錄為:Project->Addto Project->New->c++ source file.命名為main.
程式碼解釋:
使用matlib.h標頭檔案:
matlib.h中定義了資料型別和一些常量以及函式。為了在工程中使用它,請在main.cpp中新增下面這行
#include<matlib.h>
初始化矩陣庫:
在main.cpp中的main函式中新增如下程式碼:(參考檔案main.cpp)
initM(MATCOM_VERSION);//初始化
////////////
//你的處理程式碼
.........
exitM();//退出
關於函式initM和exitM的詳細資訊將在“呼叫函式"一節中介紹。
關鍵點:請編譯和執行程式,而且不應該有錯誤。當然該程式什麼都沒作,但是成功地執行程式表明前面的設定沒有錯誤。
建立矩陣:
Matrix矩陣庫的資料型別被命名為Mm。比如我們需要三個矩陣:a,b,x.新增下面這句話能夠建立三個矩陣:
Mm a;
Mm b;
Mm x;
a,b,x被構造為空矩陣。他們目前不含任何元素。當然上面這三句應新增在initM和exitM之間。因此exitM一般是在程式退出時呼叫。
設定矩陣元素:
現在我們設定矩陣a為隨機值,矩陣b手動設定:
a=rand(3);
b=zeros(3,1);
b.r(1,1)=3;b.r(2,1)=-1;b.r(3,1)=5;
display(a);
display(b);
display函式顯示a和b的值。請注意,我們並沒有為a手動申請記憶體,過載運算子=為我們處理好了記憶體分配。我們也沒有為b申請記憶體,因為.r(row,col)我我們進行了賦值操作直。
程式碼如下:
#include<matlib.h>
int main()
{
initM(MATCOM_VERSION);
Mm a;
Mm b;
Mm x;
a=rand(3);
b=zeros(3,1);
b.r(1,1)=3;b.r(2,1)=-1;b.r(3,1)=5;
display(a);
display(b);
exitM();
return 1;
}
編譯執行,結果如下:
2.9呼叫矩陣庫函式
為了解一個線性方程組,ax=b,我們將呼叫mldivide函式。新增程式碼如下:
x=mldivide(a,b);
display(x);
執行結果如下:
2.10獲取矩陣元素
我們用display列印整個矩陣,為了獲得單個元素,可以使用函式.r(row,col),如下程式碼將遍歷整個矩陣元素值:
printf("\n");
for ( i=1;i<=x.rows();i++)
{ for (int j=1;j<=x.cols();j++)
{
printf("x(%d,%d)=%14.6g",i,j,x.r(i,j));
}
printf("\n");
}
輸出結果如下:
檔案下載連結: https://download.csdn.net/download/yantao_wang/9965272
參考連結: