VC++6.0使用MATCOM矩阵库的方法

来源:互联网 发布:jenkins 自动编译java 编辑:程序博客网 时间:2024/06/05 08:04

最近在做一个项目,甲方要求使用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://pan.baidu.com/s/1o8r6dqM 密码: de5f

参考链接:

修复vc6.0

Matcom使用手册


阅读全文
0 0