zl程序教程

您现在的位置是:首页 >  后端

当前栏目

将MATLAB的变量数据导入到C/C++程序中的方法

2023-09-11 14:15:39 时间

怎样将将MATLAB的变量数据导入到C/C++程序中?

最开始,我想在VC中直接调用MATLAB-Workspace中的变量,即通过混合编程的方式来实现将MATLAB的变量数据导入到VC中,如果以后还需要这种方法,可以参考以下资料:
http://www.tuicool.com/articles/eQBrQva (需登陆后才能查看,帐号 2487872782@qq.com 密码jxke4sss)
http://blog.sina.com.cn/s/blog_67d069a90100q37c.html (博主2022-04-15注:新浪博客基本快死了,所以看不了,这个没办法)

混合编程这种方法要求先在VC中添加“include”文件,并加一些库文件~
详细的配置可以参考这个word文档 链接:http://pan.baidu.com/s/1gfdeVLp 密码:5tg5
第一个链接中的例程我是实现了的,然而运用到自己的程序中就完全不行了,而且这种混合编程,MATLAB只会出来一个控制台,workspace、windows之类的窗口完全没有,操作起来很不方便。

一番折腾后,最后得出的经验是,不到万不得已,不要用混合编程。

当然,让我坚定不用跨平台、跨语言的方法还是我在网上看到以下这段文字:
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!


所以可见,一般来说,最好的方法还是把MATLAB的变量输出到txt文件中,然后再让VC去调这个txt文件,下面具体说下我这次的做法。具体的代码如下:

clear all;
a=[1,2,3;4,5,6;7,8,9];
fid=fopen('C:\Users\Administrator\Documents\MATLAB\write_data.txt','wt');
fprintf(fid,'%g ',a);
fclose(fid);

上面的代码中我要说明下w和wt的区别,如下:wt是打开文件以文本格式写入。”w“是打开文件用户写入,一般缺省时以二进制格式写入。w与wt最明显的区别是有些时候(并不是所有时候)对于\n和空格等,前者没有效果,不会换行,也不会输出空格而后者会。没有换行,没有空格,肯定不是我们想要的,因为如果没有这些生成的txt的数据将没有空格的连成一片,所以我们要将参数写成wt。另外w和w+的区别在于前者只能写,后者又能读又能写!所人上面程序中的参数又能写成w+t

运行上面的程序后,我们发现生成的write_data.txt中的结果为:1 4 7 2 5 8 3 6 9 我们发现,MATLAB是按列向量输出矩阵数据的,这显然不是我们需要的行向量,我们需要的是1 2 3 4 5 6 7 8 9怎么办呢?其实很简单,把a转置一下不就行了,修改程序如下:

clear all;
a=[1,2,3;4,5,6;7,8,9];
a=a';
fid=fopen('C:\Users\Administrator\Documents\MATLAB\write_data.txt','wt');
fprintf(fid,'%g ',a);
fclose(fid);

上面这段程序的输出结果就是 1 2 3 4 5 6 7 8 9 

接下来,就是把这个包含变量数据的write_data.txt引入到VC中,方法如下:
1 修改write_data.txt的后缀名为write_data.h
2 将write_data.h放入VC的某个include路径下
3 在cpp文件包含头文件的地方写上#include <owrite_data.h> 这句语句
4 修改write_data.h的内容为 int[9] a={1,2,3,4,5,6,7,8,9};或char[9] a={1,2,3,4,5,6,7,8,9};等...反正要定义成什么类型和变量名取什么完全看自己的需要!这里要特别注意这对花括号的输入方法,最好是从经测试无误的cpp文件中复制到这个头文件中,我有一次就是自己在txt中输入这个花括号,结果老是 报错!另外在C程序中一定要以逗号隔开数字啊,空格是不行的
5 在程序中引用数组a即可。

当然,更专业的利用文件传递小量数据的方法可以参看我写的另一篇博文,链接如下:

https://blog.csdn.net/wenhao_ir/article/details/123413248

如果数据量大,博主想到的思路是用建立数据库的方法,诸君认为呢?