为啥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函数有以下限制:[...]每个变量必须是二维double或 char 数组。 你不能只保存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