为什么MATLAB不能保存uint8类型矩阵?

时间:2017-08-29 23:35:42

标签: matlab save

以下是代码:

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在2d数组中保存我的8位无符号整数值,然后读入测试台。

1 个答案:

答案 0 :(得分:3)

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是必要的,因为它按列读取数据,而大多数其他语言(根据我的经验)读取行。