1. 請在matlab中保持當前路徑在該數據文件對應的目錄下進行存取,否則,存取時請給出該數據文件的具體路徑。
2. 存取時,請給出該數據文件的全稱(包括後綴名,讀取mat文件時可省略)
3. load data.txt和A=load(『data.txt』)的區別請參閱精華貼:[原創]寫給學習matlab 的新手們
4. 請根據讀寫需要來打開文件,即根據你的需要來指定fopen的permission屬性為讀或寫。如果只用a進行寫入,就不能用fread讀取。此時應該寫完關閉文件,然後用r打開讀取,或者直接用a+進行同時讀寫操作。否則,會產生莫名其妙的問題!以下代碼是一個錯誤的例子:
filename='e.dat';
fid=fopen(filename,'a');
if fid<0
error('fopen error');
end
s=[1 2 3 4;5 6 7 8];
fwrite(fid,s,'float32')
[dd ll]=fread(fid,inf,'float32');
%把t中的數據全部讀出,即s矩陣。
fclose(fid);
此時得到的dd,ll是錯誤且無意義的!
1. 連續讀取多個文件的數據,並存放在一個矩陣中:
(1) 首先是如何讀取文件名:
方法一:
filename=dir(『*.jpg』);
那麼第i個文件的文件名就可以表示為
filename(i).name
文件數量為:length(filename)
方法二:
先在Windows的 MSDOS(命令行)中使用以下命令生成一個list.txt文件:
dir path\folder /on /b /s > path\list.txt
舉例:dir d:\test /on /b /s > d:\list.txt
然後在 matlab 中使用:
filename = textread(sFileFullName,'%s');
把所有文件名讀取到list細胞矩陣中,最後對filename{i}便可得到各文件名。
(2) 然後是讀取文件名的數據並存儲:
假設每個文件對應的數據是m*n的,則:
k = length(filename);
Data = zeros(m,n,k);
for ii = 1:k
Data(:,:,ii) = yourreadstyle(filename{ii});
%yourreadstyle是對應的文件讀取方式的函數
end
2. 連續讀取多個文件的數據,並存放在多個矩陣(以文件名命名)中:
假設每個文件對應的數據是m*n的,則以上述第二種文件名讀取方法為例:
k = length(filename);
for ii = 1:k
D = yourreadstyle(filename{ii});
eval([『Data_』, num2str(ii), 『 = D;』]);
end
3. 文件名命名問題:
文件名為abc00001,abc00002,... abc00009,abc00010,...
abc00099,abc00100,...abc00879. 準備把這些文件名給放到一個數組裡面去。
解答:
a=cell(879,1);
for k=1:879
a{k} = sprintf('%.5d',k);
end
4. 上述各種文件格式、類型自動識別問題:
可以利用正則表達式來處理,使之通用性較強。例如使用以下代碼可以自動處理上面提到了例1到例5各種情形,不過由於存在自動判斷,對某些例子(如例1)效率自然要低一點,而對於另外的例子(如例3、例5)效率估計要高一點(少用了一個循環)。
function [data]=distilldata_eight(infile)
%功能說明:
%將保存數據的原始文件中的數值數據讀入到一個data變量中(自動判斷數據行)
%使用說明:
% infile——原始數據文件名;
% data=數據變量
tmpfile='tmp2.mat';
fidin=fopen(infile,'r'); %打開原始數據文件(.list)
fidtmp=fopen(tmpfile,'w'); %創建保存數據文件(不含說明文字)
while ~feof(fidin) %判斷是否為文件末尾
tline=fgetl(fidin); %從文件讀入一行文本(不含回車鍵)
if ~isempty(tline) % 判斷是否空行
str = '[^0-9 | \. | \- | \s | e | E]'; %正則表達式為:該行中是否包含除 - . E e 數字 和空白字符外的其他字符
start = regexp(tline,str, 'once');
if isempty(start)
fprintf(fidtmp,'%s\n',tline);
end
end
end
fclose(fidin);
fclose(fidtmp);
data=textread(tmpfile);
delete(tmpfile)
5. 大量數據的讀取問題:
可以考慮使用循環分批讀取(特別是在各數據是獨立的時候),或者使用稀疏矩陣來實現(對此可以參閱本版精華貼:
[原創]提高matlab運行速度和節省空間的一點心得(之三))。另外,也可參考《深入淺出MATLAB 7_X混合編程》一書第一章
6. 讀取整個txt文件的內容(獲得文件中的所有字符):
f = fopen('yourfilename.txt','rt'); %t屬性根據需要可省略
x = fread(f,'*char');
fclose(f);
7. 把維數不同的矩陣及其變量名保存到一個txt文件中,例如 a1=123; a2=[1 2 3;4 5 6],希望得到的txt文件如下:
a1:
123
a2:
1 2 3
4 5 6
如果寫入的時候簡單一點,則可以採用以下方式,不過讀取的時候比較麻煩:
a1=123;
a2=[1 2 3;4 5 6];
fid = fopen('myfile.txt', 'wt');
for i=1:2
fprintf(fid, '%s: \n %s\n', ['a',int2str(i)], mat2str(eval(['a',int2str(i)])));
end
fclose(fid);
相反,如果寫入的時候覆雜一點,則讀取的時候會簡單一點:
a1=123;
a2=[1 2 3;4 5 6];
fid = fopen('myfile.txt', 'wt');
for i=1:2
fprintf(fid, '%s: \n', ['a',int2str(i)]);
b=eval(['a',int2str(i)]);
fprintf(fid, [repmat('%d ', 1, size(b,2)), '\n'], b');
end
fclose(fid);
聲明:本文由聲振論壇會員eight原創,版權歸原作者所有,轉載請註明:來自@聲振之家公眾號。