[Matlab+C/C++] 读写二进制文件
2016-03-08 01:08
375 查看
introduction
因为Matlab操作简单、方便,它被应用于很多领域:音频处理,图像处理,数值计算等。尽管MATLAB容易操作,但受限于他的语言解释机制,MATLAB的执行速度通常较低。C/C++一般被认为是执行较为高效的高级程序设计语言。如果结合MATLAB和C/C++,也许我们可以获得操作简便性和执行速度的折中。这种结合的一般形式是:MATLAB负责绝大部分工作,C/C++负责一些关键部分的实现,其具体方法在我之前的博文中已经有所介绍。在处理某些数据的时候,可能涉及到文件的读写,如果用MATLAB存储为mat文件,那么其它程序读取这种数据就变得困难了。如果将数据存为文本文件,文件的解析过程就会变得比较长。幸运的是MATLAB可以读写自定义格式的二进制文件,基本所有程序语言(包括C/C++)在内,都是支持二进制文件的读写操作的。本文就介绍一下如何使用MATLAB和C/C++对二进制文件进行读写。
准备知识
MATLAB和C/C++并不采用相同的规则来存储矩阵数据!在联合MATLAB和C/C++时,一定要注意这一点:C/C++按行存储数据;MATLAB按列来存储数据。举例说明,假设我们有一个2行3列的矩阵,共23=6个元素,假设他的数据如下:那么,在MATLAB中,在内存中的存储顺序为 1,4,7,2,5,8,3,6,9. 在C/C++中的存储顺序为1,2,3,4,5,6,7,8,9. 因此内存中的同一块数据,MATLAB和C/C++的解析结果是不同的。在实际开发过程中要特别注意这一点。
MATLAB写矩阵到二进制文件
MATLAB提供了四个函数来读写二进制文件:fopen(...),
fread(...),
fwrite(...),
fclose(...).
举例说明如何对二进制文件进行读写操作:
实例1:将双精度矩阵以单精度浮点数类型存入二进制文件
% 生成一个2行3列的双精度浮点数类型的矩阵 A = rand(2,3); % 在当前工作目录下以二进制写方式 ('w') 打开'test.dat' fid = fopen('test.dat', 'w'); % 将矩阵A的元素以单精度浮点数类型写如fid关联的二进制文件 fwrite(fid, A, 'single'); % 将与fid关联的文件关闭 fclose(fid);
实例 2:以单精度浮点数类型读入MATLAB
% 在当前工作目录下以二进制读方式 ('r') 打开'test.dat' fid = fopen('test.dat', 'r'); % 从与fid关联的二进制文件读取6个元素,每个元素以单精度浮点类型解析 B = fread(fid, 2*3, 'single'); % 将与fid关联的文件关闭 fclose(fid);
实例2中,B是一个61的矩阵,如果想得到与实例1中的A类似的形式,可以这样做:
B = reshape(B, 2, 3)
C读取二进制数据
C读取二进制数据的方式与MATLAB类似。实例 3: 用C语言读取实例 1 的test.dat
// 完整的C代码 #include <stdio.h> #include <stdlib.h> int main(){ int i; char *filename = "test.dat"; float data[6]; FILE *fs = fopen(filename, "r"); fread((void*)data, sizeof(float), 6, fs); fclose(fs); // 显示数据 for (i = 0; i < 6; i++){ printf("%f\n", data[i]); } return 0; }
实例 3 的输出结果跟实例 2 中读取的B的结果是一致的。如果对实例 2 中的B用MATLAB进行reshape操作,B就会变成跟实例 1 中的A类似的存储结构,A和B的差别只在于他们的数据类型不同。实例 3 中使用data的时候,如果要想跟MATLAB一样索引第 i 行 第 j 列的元素,则必须转置访问!
如果在C中有大量的后续操作,并且你的大部分重要工作用C来完成的话,建议在MATLAB中的写操作可以将矩阵变换行列(不是共轭转置)后再做写入,修改如下:
fwrite(fid, A.', 'single');
C++读二进制文件
用C++读二进制文件需要fstream类,实例如下:实例 4 : 用C++ 读取实例 1 写入的test.dat
// 完整C++代码 #include <iostream> #include <fstream> #include <string> using namespace std; int main(){ float data[6]; string filename = "test.dat"; ifstream fs; fs.open(filename, ios_base::binary | ios_base::in); fs.read(reinterpret_cast<char*>(data), sizeof(float)* 6); fs.close(); for (int i = 0; i < 6; i++){ cout << data[i] << endl; } return 0; }
总结
使用MATLAB和C/C++可以较快的完成算法的开发的同时,获得一个较快执行速度的程序。在联合使用MATLAB和C/C++时,一定要注意数据的存储顺序。
相关文章推荐
- [Matlab+C/C++] 读写二进制文件
- matlab实现相位解包裹
- matlab使用
- Matlab的小技巧
- 保存matlab command window缓冲区中的日志
- Matlab 中绘制模糊隶属度函数
- Matlab中cell数组的使用
- 将matlab中数据导出VC导入
- 用MATLAB畫925hPa位勢高度分布圖
- caffe 在windows系统下的配置,以及matlab接口配置
- matlab的figure窗口命名为中文
- 数据归一化matlab及python 实现
- MATLAB仿真
- Export Figures for LaTeX Writing
- Image Batch Processing with Matlab
- 基于MATLAB实现的云模型计算隶属度
- MATLAB存储矩阵到txt文本
- K均值聚类算法的MATLAB实现
- Matlab写入文件
- 多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)