[Matlab+C/C++] 读写二进制文件
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++] 读写二进制文件的更多相关文章
- 【转】C++读写二进制文件
原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章 ...
- C/C++读写二进制文件
C++读写二进制文件 最近在给android层提供支持,因此代码都是用标准库库函数写出来的,好多windows和第三方的库不能或者很难使用,下面有我在读写二进制文件时候的一些心得,也算是一种总结吧 1 ...
- Matlab之文件读写
读文件: (0)自己添加 你可以将txt的一些文本数据直接拷贝到matlab窗口,然后保存为mat文件,下次就可以直接采用load函数了. (1)Load load 从Matlab的数据文件.mat ...
- c++读写二进制文件
要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法,可以使用fstream 类,这个类可以对文件进行读写操作. 1.打开文件. 打开文件可以有两种方式,第一 ...
- Matlab优化存储器读写来改善程序性能
最近用Matlab写程序的时候终于遇到了程序执行效率的问题,于是在Google上面搜索了一篇提高代码性能的文章,简单的概括一下. 文章是通过优化寄存器读写来提高执行速度的,主要体现在三个方面: 在做循 ...
- MATLAB 通过二进制读写文件
这几天在做信息隐藏方面的应用,在读写文本文件时耗费许久,故特别的上网学习一二,这里给出一常用读写,其他的都类似. 很多时候,我们都要将一个.txt以二进制方式读出来,操作后在恢复成.txt文本. ma ...
- Java读写二进制文件示例
相对于文本文件,二进制文件读写快,定位快而准,下面是代码示例: import java.io.DataInput; import java.io.DataOutput; import java.io. ...
- C++入门到理解之文件操作(文本文件的读写+二进制文件的读写)
原文地址http://www.javayihao.top/detail/168 一:概述 1.程序在运行中产生的数据都是临时数据,程序一旦运行结束会被释放,可以通过文件相关的操作将数据持久保存. 2. ...
- C语言读写二进制文件
fseek用法 fseek用来移动文件指针.函数原型 int fseek(FILE * stream, long offset, int fromwhere); 参数解释: stream 是文件流指针 ...
随机推荐
- scrollTop doesn't scroll on Chrome 61
在chrome61 不支持滚动 解决方案: Use document.scrollingElement if supported, and fall back to the current code. ...
- webstorm 2018.1 激活码 2018.4.8日更新
安装完成后,打开 WebStorm, 在打开的 License Activation 窗口中选择 License server. 在输入框输入网址即可: http://hb5.s.osidea.cc: ...
- Spring-cloud(二)注册服务提供者搭建
上文已经写了如何去搭建注册中心,仅有注册中心是远远不够的,所以我们需要注册到注册中心并提供服务的节点,这里称为注册服务提供者 前提 阅读上文,并成功搭建注册中心,环境无需改变 项目搭建 这里我们需要新 ...
- java多线程的字符流与字节流
字节流: package com.wz.thread.stream;import java.io.PipedOutputStream;/** * 字节输入流 * @author Administrat ...
- TensorFlow学习笔记(MNIST报错修正 适用Tensorflow1.3)
在Tensorflow实战Google框架下的深度学习这本书的MNIST的图像识别例子中,每次都要报错 错误如下: Only call `sparse_softmax_cross_entropy_ ...
- [SHOI2011]双倍回文
Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长 ...
- bzoj 5286: [Hnoi2018]转盘
Description Solution 首先注意到一个点不会走两次,只会有停下来等待的情况,把序列倍长 那么如果枚举一个起点\(i\),答案就是 \(min(max(T[j]+n-(j-i)-1)) ...
- 51 nod 1515 明辨是非(并查集合并)
1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...
- POJ 2289(多重匹配+二分)
POJ 2289(多重匹配+二分) 把n个人,分到m个组中.题目给出每一个人可以被分到的那些组.要求分配完毕后,最大的那一个组的人数最小. 用二分查找来枚举. #include<iostream ...
- 【hihoCoder 1419】重复旋律4
Description 小 Hi 平时的一大兴趣爱好就是演奏钢琴. 我们知道一个音乐旋律被表示为长度为 N的数构成的数列. 小 Hi 在练习过很多曲子以后发现很多作品中的旋律有重复的部分. 我们把一段 ...