1. 程式人生 > >VC++6.0使用MATCOM矩陣庫的方法

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


參考連結: