• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[Matlab+C/C++]读写二进制文件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

introduction

由于Matlab操作简单、方便,它被应用于非常多领域:音频处理,图像处理,数值计算等。虽然MATLABeasy操作。但受限于他的语言解释机制。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列的矩阵,共2


那么,在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++时,一定要注意数据的存储顺序。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi二维码产生和扫描发布时间:2022-07-18
下一篇:
delphi利用bing翻译API做的多国语言翻译软件 - 老神仙发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap