您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何進(jìn)行MATLAB fread函數(shù)分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
MATLAB的確用起來很方便,前提是你了解它的函數(shù)~
MATLAB的幫助文檔看的那叫一個(gè)似懂非懂啊,特此總結(jié)。對(duì)我而言, fread的主要調(diào)用形式是這樣的:
data = fread(fid, N, 'str')
fid不用說,自然是文件句柄(如fid=fopen('abc.txt' ,'r')),N是讀入的元素個(gè)數(shù),'str'是格式。在以前不會(huì)用的時(shí)候,格式都是直接省略的,這個(gè)時(shí)候函數(shù)就一個(gè)字節(jié)一個(gè)字節(jié)地從文件中讀入數(shù)據(jù),再在MATLAB中轉(zhuǎn)化為double形式。
如果文件時(shí)二進(jìn)制文件,這樣讀當(dāng)然沒問題,如果想要讀入的是文本,那就不行了。文本也是一個(gè)字節(jié)一個(gè)字節(jié)地讀,但是最后應(yīng)該轉(zhuǎn)化為char型:
>> frewind(f); >> a=fread(f,1,'char=>char') a = B >> frewind(f); >> a=fread(f,1,'uchar=>uchar') a = 66
>> class(a)ans =uint8>> frewind(f); >> a=fread(f,1,'uint8=>char') a = B >> frewind(f); >> a=fread(f,1,'uchar=>char') a = B
>> frewind(f); >> a=fread(f,1,'int8=>char') a = B
上面是一個(gè)BMP文件的例子,讀入的是文件第第一個(gè)字節(jié),BMP文件以“BM”開頭,第一個(gè)自己自然是B。int8、uint8、char、uchar是幾種一個(gè)字節(jié)的數(shù)據(jù)類型。在例子中,a=>b表示以a的類型讀入,再轉(zhuǎn)化為b類型。a的作用是控制每次讀入的字節(jié)數(shù),然后轉(zhuǎn)化為相應(yīng)的類型,形成一定的數(shù)值,b的作用是在a的基礎(chǔ)上進(jìn)行轉(zhuǎn)化。這里都是一個(gè)字節(jié),讀入以后,最后如果是char型,就都變成了字母B,如果是uchar型,就變成uint8。
以上是字節(jié)數(shù)相同的例子,a=>b,a似乎沒多大用,但是,當(dāng)字節(jié)數(shù)不同時(shí),就大有用場(chǎng)了:
>> frewind(f); >> a=fread(f,1,'uint16=>uint8') a = 255 % 在這里,uint16是兩個(gè)字節(jié)的,所以一次性讀入2個(gè)字節(jié),先以u(píng)int16的形式讀入,整數(shù)的排列規(guī)則是很簡單的,假設(shè)低字節(jié)為a,高字節(jié)為b,那就等于b*256+a,得到的數(shù)肯定超過256,最后又要轉(zhuǎn)化為uint8,因此只能截?cái)嗔?,uint8一個(gè)字節(jié),最大能表示的數(shù)就是255,因此返回255.
>> frewind(f); >> a=fread(f,1,'uint16=>float') a = 19778
% 這里,說明以u(píng)int16讀入的數(shù),得到為19778,然后再轉(zhuǎn)為單精度的float型,還是19778,當(dāng)然,類型已經(jīng)換掉了 >> frewind(f); >> a=fread(f,1,'*uint32') a = 37637442
% *uint32相當(dāng)于uint32=>uint32,以4個(gè)字節(jié)的形式讀入,成為一個(gè)整數(shù)。
>> frewind(f); >> a=fread(f,1,'uint32=>float') a = 37637440 % 以四個(gè)字節(jié)的形式讀入,先變成整型,再變成float型,末尾的2丟掉了,是精度問題?
>> class(a) ans = single
>> frewind(f); >> a=fread(f,1,'uint32=>double') a = 37637442 % 轉(zhuǎn)化為double,精度就夠了
>> frewind(f); >> a=fread(f,1,'float=>double') a = 1.3981e-037
% 最精彩的來了,盡管float和uint32都是4個(gè)字節(jié),但是這里得到的數(shù)卻不與上面相等。前面說了,a=>b,系統(tǒng)以a的格式,讀入相應(yīng)的字節(jié)數(shù),轉(zhuǎn)化為a類型的一個(gè)數(shù)值,再將a轉(zhuǎn)為b類型,這里讀入的時(shí)候,以float的規(guī)則來讀,再將float轉(zhuǎn)為double,無非是提高精度而已。 >> frewind(f); >> a=fread(f,1,'float=>uint32') a = 0
% 讀到的是1.3981e-037,轉(zhuǎn)化為整數(shù),當(dāng)然是0了
此外,我還嘗試過以下格式:
>> a=fread(f,1,'3*int8=>char') a = B
N*a=>b的形式,一般用在有skip(跳過)的地方,這里沒有在后面的參數(shù)中指定跳過,所以默認(rèn)的跳過為零,得到的結(jié)果還是字母B。跳過形式往往用在按bit讀的時(shí)候,
>> a=fread(f,3,'*uint8') a = 66 77 62 >> frewind(f); >> a=fread(f,4,'1*int8=>int8',1) a = 66 62
2
0 % 注意,前面讀入的時(shí)候按int8讀,所以跳過的時(shí)候,跳的是1個(gè)int8的長度,因此跳過了77,結(jié)果為66,,62
>> frewind(f); >> a=fread(f,2,'1*bit8=>int8',8) a = 66 62
% 前面是bit8,凡是bitN的類型的,后面跳過時(shí)都指的是跳過幾個(gè)bit
>> frewind(f); >> a=fread(f,2,'1*bit16=>int8',8)a = 127 2%前面讀入是按兩個(gè)字節(jié)讀(bit16),因此第一次讀進(jìn)來的是66和77,后來要轉(zhuǎn)為int型,int表示的范圍-128~127,因此就變成127了。然后跳過了62,下一個(gè)數(shù)字是2,在下一個(gè)數(shù)字是0,因此加在一起就是0了。
另外,最全的調(diào)用形式是
[data, n] = fread(fid, N, 'a=>b', nn, 'l/n/b/...')
最后一個(gè)參數(shù)的作用是指定大端小端,windows這種用intel的是小端,低地址放低字節(jié),所以讀進(jìn)66和77,66在低地址,他是低字節(jié),77是高地址,是高字節(jié),結(jié)果為66+77*256,UINX之類的一般是大端。網(wǎng)絡(luò)通信一般是大端
'b' :大端
'l' :小端
'n' :原來是大端現(xiàn)在就是大端,原來小端現(xiàn)在就是小端!
返回的n是指實(shí)際讀進(jìn)了幾個(gè)單元。把n和N一比較,相等就說明確實(shí)讀進(jìn)了所需要的N個(gè)數(shù)據(jù)。
關(guān)于如何進(jìn)行MATLAB fread函數(shù)分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。