Matlab fread的问题:imwrite写single精度的大矩阵,结果不对
2014-01-01 17:56
537 查看
前面的博客《C++读取Matlab的mat文件的注意事项》中讲了如何在C++中读取mat文件,这里我们将mat文件转成二进制文件。然后用标准的读取读取文件流的方法来读取。
当然,对于矩阵型的mat文件来说,用fwrite和fread是非常方便的,只要指定buf的大小就可以了一次性读入了。
转成二进制文件的好处是可以摆脱依赖mex文件库,独立性更强。但是比起mat文件,二进制文件要大的多。比如4MB的mat文件转成多个二进制文件大小为39MB。
这里要说的问题是,我发现用Matlab的fwrite时出现了一个bug。原因不知为何。当我用single的精度fwrite single类型的mat文件data矩阵到二进制文件时:
fid = fopen('data.st','wb');
fwrite(fid,data,'single');
当data中的值比较小时(比如我实验中当值小于0.1时),写入二进制文件。然后用C++ imread到一个float类型的buf后的值是错误的,值全部为接近0的极小负数。
刚开始以为是精度弄错了,但其实Matalb中的single和float同样占4个字节。应该是没有问题的。如果我将data在写入文件之前乘以个100,那么结果是对的。
我打开二进制文件发现对应的值确实是错误的,也就是C++读取出来的那个接近0的极小负数。所以猜想可能是imwrite本身就写错了。但是我又用Matlab的imread读取这个二进制文件,发现读回来的值又是对的。而且当data的大小很小时,比如一个1*10的向量这种bug不存在。原因不明,不知哪位可以帮忙解释呢?
所以的我能想到的解决办法:
1)fwrite之前全部乘以某个值使最小值不要过小,但是这个不够科学
2)转成double类型,当然文件大小会翻倍。
当然,对于矩阵型的mat文件来说,用fwrite和fread是非常方便的,只要指定buf的大小就可以了一次性读入了。
转成二进制文件的好处是可以摆脱依赖mex文件库,独立性更强。但是比起mat文件,二进制文件要大的多。比如4MB的mat文件转成多个二进制文件大小为39MB。
这里要说的问题是,我发现用Matlab的fwrite时出现了一个bug。原因不知为何。当我用single的精度fwrite single类型的mat文件data矩阵到二进制文件时:
fid = fopen('data.st','wb');
fwrite(fid,data,'single');
当data中的值比较小时(比如我实验中当值小于0.1时),写入二进制文件。然后用C++ imread到一个float类型的buf后的值是错误的,值全部为接近0的极小负数。
刚开始以为是精度弄错了,但其实Matalb中的single和float同样占4个字节。应该是没有问题的。如果我将data在写入文件之前乘以个100,那么结果是对的。
我打开二进制文件发现对应的值确实是错误的,也就是C++读取出来的那个接近0的极小负数。所以猜想可能是imwrite本身就写错了。但是我又用Matlab的imread读取这个二进制文件,发现读回来的值又是对的。而且当data的大小很小时,比如一个1*10的向量这种bug不存在。原因不明,不知哪位可以帮忙解释呢?
所以的我能想到的解决办法:
1)fwrite之前全部乘以某个值使最小值不要过小,但是这个不够科学
2)转成double类型,当然文件大小会翻倍。
相关文章推荐
- 关于matlab提示“警告: 矩阵为奇异工作精度” 的问题
- matlab中计算精度的问题
- MATLAB产生的导频经QPSK调制后的精度的问题
- 问题五十二: (接五十题)软件工程师不涨工资不对。工作经验、效率逐年提高,这家公司不给涨,会找另一家给涨工资的公司做。假如每年工资涨5%,结果又是如何呢?
- 51NOD 1836 战忽局的手段(矩阵乘法加速+__float128精度问题+概率期望)——算法马拉松20(告别美国大选及卡斯特罗)
- 关于BigDecimal精度影响计算结果的问题
- matlab中的显示精度问题
- Caffe训练AlexNet网络,精度不高或者为0的问题结果
- matlab遇到问题-矩阵索引值超维问题
- Matlab如何把for循环的结果以矩阵的形式显示
- 关于float、double结果精度的问题
- MATLAB矩阵索引问题
- C++、Java和Matlab不同语言关于 y=(++x)+(++x);结果不同的问题
- cuda 反傅里叶变换结果不对的问题
- Matlab精度,sprintf('%.40g',7/10)的问题
- JS两个小数相加,精度不对问题
- matlab 数据存储成excel文件时的精度问题
- float 精度及有效位数导致的结果误差问题
- 两个矩阵相乘但是结果不对,只有第一行的对,求解!
- 多分类问题中混淆矩阵(Confusion Matrix)的Matlab画法 | 丕子