2017-08-29 96 views
0

下面是代碼:爲什麼MATLAB不能保存uint8類型的矩陣?

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時不能保存數據8。我必須將數據讀入VHDL測試平臺,以便進行試驗。我想唯一的選擇是使用printf將二維數組中的8位無符號整數值保存起來,然後讀入測試平臺。

+3

從'help save':_對於ASCII文件格式,save函數有以下限制:[...]每個變量都必須是一個二維__double__或__char__數組._你不能只保存'y = double(x)'而不是'x'?但是請注意,這將在文本文件中寫入諸如「8.1000000e + 01」而不是「81」之類的內容。或者試試'dlmwrite('pqfile.txt',x)' –

+0

這不是一個VHDL問題,所以請刪除標籤 – JHBonarius

+0

MATLAB寫的數據是一個二維數組,可以讀入VHDLA測試平臺 – quantum231

回答

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,因爲它讀取數據按列,而大多數其他語言(在我的經驗)逐行讀取-明智的。