前言
工程中经常将参数文件存储为bin
格式, 但是实际中为了分析其参数, 也不好用C++去读取调试它, 所以可以用matlab
或者python
去读取它, 但是还是蛮坑的
Matlab中的读取和写入
写入文件
比较坑的是, 一定要注意自己的文件存储的类型, 比如数值是float
还是double
之类的, 不然很容易在读取的时候出问题.
关于数字的写入方法如下:
fileID=fopen('MatrixTest.bin','w');%w+是不擦除,直接附加内容
a=[1,2,3;4,5,6;7,8,9];
fwrite(fileID,a,'double');%存储为double类型
fclose(fileID);
文本的写入方法同样:
fileID=fopen('TxtTest.bin','w');%w+是不擦除,直接附加内容
a='哈哈哈哈嗝';
fwrite(fileID,a,'char');%写入格式char
fclose(fileID);
读文件
一定要与写入的数据类型相同
读取bin
中存储的矩阵
fileID=fopen('MatrixTest.bin');
A=fread(fileID,[17,17],'double')
fclose(fileID);
%% 输出
A'ans =1 4 7 2 5 8 3 6 9
可以发现matlab是列读取的, 如果我们知道矩阵的大小,那么就可以指定好
fileID=fopen('MatrixTest.bin');
A=fread(fileID,[3,3],'double')
fclose(fileID);
%输出
A =1 2 34 5 67 8 9
如果我们将double
类型替换成float
,得到的结果就是
A =0 2.2500 01.8750 0 2.00000 2.4375 0
可以发现是完全错误的,当然我们不指定类型, 即去掉double
, 最终的结果也是错误的, 因而这个格式需要非常严格.
读取文本就需要用另一个函数native2unicode
,而且不需要指定数据类型
fileID=fopen('TxtTest.bin');
A=fread(fileID);
native2unicode(A')
fclose(fileID);
%输出
ans =哈哈哈哈嗝
Python中的读取和写入
主要涉及到tofile
和fromfile
两个函数, 同时也必须注意存储的矩阵数值的类型
写入文件
import numpy as np
import sys
a=np.arange(1,10,1).reshape(3,-1)
a=np.asarray(a,dtype='float')
a.tofile('matrix_a.bin')
这样我们就在bin
文件中存储了一个矩阵, 类型为float
[[ 1. 2. 3.][ 4. 5. 6.][ 7. 8. 9.]]
读取文件
读取就很简单了,就一个函数,只不过要提前知道数据类型
b=np.fromfile('matrix_a.bin','float')
#输出
#[ 1. 2. 3. 4. 5. 6. 7. 8. 9.]
总结
从这里可以发现, 无论是matlab还是python, 我们存储和读取的时候的数据类型一定要一致,不然读到的结果就是错误的. 还可以发现matlab是按列存储, python是按行存储的