2017-08-29 16 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のときは、どのようにデータを保存できないのですか? VHDLテストベンチにデータを読み込まなければならないので、実験していました。私は唯一のオプションは、printfを使用して2次元配列に8ビットの符号なし整数値を保存してからテストベンチに読み込むことだと思います。

+3

ASCII形式のファイルの場合、save関数には次のような制限があります:[...]各変数は2次元の__double__または__char__配列でなければなりません。 'x'の代わりにdouble(x)'を使いますか?ただし、これはテキストファイルに '81'の代わりに' 8.1000000e + 01'のようなものを書き込むことに注意してください。または、 'dlmwrite( 'pqfile.txt'、x)' –

+0

を試してください。これはVHDLの質問ではありませんので、タグ – JHBonarius

+0

を削除してください。MATLABによって書き込まれたデータは、VHDLAテストベンチ – quantum231

答えて

3

ASCIIオプション

save方法は、それがサポートすることができるものでは多少制限され、その後、それはあなたがいるような数字の制限された範囲を扱うとき、あなたのファイルをbloatsあなたの数字を表現するために浮動小数点表記を使用しています(つまり、uint8,0〜255)。

dlmwritedocumentation here)を参照してください。

書き込む/保存する変数、保存する変数、値を区切る区切り文字などの追加パラメータが必要です。

単一バイトが、あなたはおそらく代わりに、カスタムバイナリファイルと一緒に行きたいとあなたが保存されているuint8のデータに探しているなら、あなた例えば、それはこの

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

バイナリオプション

のように見えますASCIIの代わりに。 (はい、あなたは、単一のASCII文字にUINT8を変換することはできますが、これらの値は、あなたの区切り文字と解釈されていると問題に遭遇;改行やタブ)

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のために必要です-賢い。

関連する問題