您的位置:首页 > 编程语言 > MATLAB

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类型,当然文件大小会翻倍。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: