为啥MATLAB不能保存uint8类型的矩阵?

Posted

技术标签:

【中文标题】为啥MATLAB不能保存uint8类型的矩阵?【英文标题】:Why can't MATLAB save uint8 type matrix?为什么MATLAB不能保存uint8类型的矩阵? 【发布时间】:2017-08-29 23:35:42 【问题描述】:

代码如下:

x = rand(5)*100;
save('pqfile.txt','x','-ascii','-tabs')

上述方法有效,但是:

x = rand(5)*100;
x = uint8(x);
save('pqfile.txt','x','-ascii','-tabs')

说:

Warning: Attempt to write an unsupported data type to an ASCII file.
    Variable 'x' not written to file.

有人知道为什么会这样吗? uint8 怎么不能保存数据。我必须将数据读入 VHDL 测试平台,所以我正在试验。我想唯一的选择是使用 printf 将我的 8 位无符号整数值保存在二维数组中,然后读入测试台。

【问题讨论】:

来自help save对于ASCII文件格式,save函数有以下限制:[...]每个变量必须是二维doublechar 数组。 你不能只保存y = double(x) 而不是x 吗?但是请注意,这将在文本文件中写入 8.1000000e+01 而不是 81 之类的内容。或者试试dlmwrite('pqfile.txt ',x) 这不是VHDL问题,所以请去掉标签 MATLAB写入的数据是二维数组,要读入VHDLA测试台 【参考方案1】:

ASCII 选项

save 方法在它可以支持的方面有些限制,然后它使用浮点表示法来表示你的数字,当处理像你这样的有限范围的数字(即 uint8、0 到 255)时,这会使你的文件膨胀)。

查看dlmwrite 作为替代方案 (documentation here)。

它需要写入/保存的文件名、要存储的变量以及一些附加参数,例如您想要用来分隔值的分隔符。

对于您的示例,它看起来像这样

x = rand(5)*100;
x = uint8(x);
dlmwrite('pqfile.txt',x,'\t');

二元期权

如果您希望将 uint8 数据存储为单个字节,那么您可能希望使用自定义二进制文件而不是 ASCII。 (是的,您可以将 uint8 转换为单个 ASCII 字符,但您会遇到使用分隔符解释这些值的问题;换行符或制表符。)

fid=fopen('pqfile.dat','wb');
if(fid>2)
    fwrite(fid,size(x),'*uint8');  % Note: change data type here you are dealing with more than 255 rows or columns
    fwrite(fid,x','*uint8'); % Transpose x (with x') so it is stored in row order.
    fclose(fid);
else
    fprintf(1,'Could not open the file for writing.\n');
end

我不确定您的 VHDL 使用的是哪种类型的解析器,但这会将您的数据打包到一个文件中,该文件带有一个预期尺寸的短标题,后跟一长行序列化数据。

要使用 MATLAB 将其读回,您可以这样做:

fid = fopen('pqfile.dat','rb');
szX = fread(fid,2,'uint8');
x = fread(fid,szX,'*uint8')';  % transpose back if you are dealing with matlab.
fclose(fid);

转置操作对于 MATLAB 是必需的,因为它按列读取数据,而大多数其他语言(根据我的经验)按行读取。

【讨论】:

以上是关于为啥MATLAB不能保存uint8类型的矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

数字图像处理 MATLAB 为啥把图像类型转换为 double

matlab图像处理为啥要double和uint8转换

MATLAB的数据类型

MATLAB的数据类型

MATLAB矩阵保存为图像问题,为啥保存图像为空白? RGB值为255。

matlab中ftt2转换后的数据是啥类型的