Matlab數據存取(三):注意事項及其他相關問題

2021-03-02 聲振之家


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原創,版權歸原作者所有,轉載請註明:來自@聲振之家公眾號。

相關焦點

  • Python是這樣調用matlab程序的!
    它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然後對其中 有特別要求的部分,用更合適的語言改寫,比如3D遊戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而後封裝為Python可以調用的擴展類庫。
  • [優化] 《MATLAB高效編程技巧與應用:25個案例分析》源程序+數據
    《MATLAB高效編程技巧與應用:25個案例分析》源程序+數據 所屬分類:計算機 > 計算機輔助設計與工程計算 > Matlab 內容簡介本書是作者八年matlab使用經驗的總結,精心設計的所有案例均來自於國內各大matlab技術論壇網友的切身需求,其中不少案例涉及的內容和求解方法在國內現已出版的matlab書籍中鮮有介紹
  • NumPy——數據CSV文件存取和多維數據的存取
    %.18edelimiter: 分割字符串,默認是任何空格3. np.loadtxtnp.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)frame : 文件、字符串或產生器,可以是.gz或.bz2的壓縮文件dtype : 數據類型
  • Matlab高速列車,準備好上車了麼
    這篇文章的初衷,旨在大家一起交流討論學術相關的技術問題。有任何錯誤和更有效的方法十分非常極其歡迎👏!
  • matlab vs R
    最大的不同在於賦值問題:matlabRx = 5:10x  <- 5:10matlab 採用等號完成賦值操作,雖然 R 語言支持使用等號完成賦值,但遵循 R 的傳統以及大多數用戶的習慣,我們仍然以 <- 作為變量賦值使用,而等號用於參數的賦值以及創建數據框過程中。
  • 提高matlab代碼運行速度的一點心得(之三)
    但是,在matlab中,同樣的算法、同樣的結構、同樣的流程,如果採用的語句不一樣,在效率上就會大大不同。所以,我認為,使用matlab比使用其他語言更加困難,也顯得matlab更難以掌握。使用sparse幾點注意:a)只能用在二維以下的矩陣上;b)由於matlab按照「先行後列」的方式讀取數據(即先把第一列所有行讀取完以後再讀取第二列的各行),因此定義稀疏矩陣時,最好「行數>列數」,這樣有利於尋址和空間的節省(自己試試a=sparse(10,5);whos a和b= sparse(5,10);whos b就知道了);c)對大型矩陣用sparse
  • 蟻群算法即相關代碼實現詳解—matlab之智能算法
    其中參數h(期望因子)和k(啟發因子)用來匹配真實實驗數據,第(M+1)只螞蟻按照上述公式計算概率,然後生成一個區間在[0,1]上均勻分布的隨機數w,若w<=P(A),則選擇路徑A,否則選擇路徑B.
  • Matlab--TXT數據的讀取
    按指定格式從文本文件活字符串中讀取數據低級函數(調用語法複雜,但是能夠按照各種格式讀取文件,具有很好靈活性)包括:fopen打開文件,獲取打開文件的信息fclose 關掉一個或多個打開的文件fgets 讀取文件中的下一行,包括換行符fgetl 調用fgets函數,讀取文件的下一行,不包括換行符fscanf 按指定格式從文本文件中讀取數據
  • 【Matlab】逐像元偏相關分析
    理論知識:偏相關分析也稱淨相關分析,它在控制其他變量的線性影響的條件下分析兩變量間的線性相關性,所採用的工具是偏相關係數(淨相關係數)。
  • 過冷水帶您走進matlab數據轉換新世界
    數據轉換對於經常使用matlab的夥伴來說是很基礎且實用的知識點,but! 相互之間轉換關係不太容易釐清,免不了書到用時求谷哥度娘。
  • 「中考」第二次報考參考數據、十個注意事項及相關建議都在這裡了
    、相關的注意事項及建議做參考:1、省重點二批次學校、近五年分數段及位次表、預測分數段:注意事項1:如果想要走省重點二批次配額,就要注意市內九區招生的市重點的填報,如果填報,先被錄取,將沒有機會走省重二批次配額。
  • 深入淺出MATLAB數據處理之文件讀寫
    這些參數都很關鍵,其實主要涉及到跨平臺操作的問題,python或者其它編譯軟體處理的文件現在matlab需要處理,那麼就必須字節順序、編譯方式要一致,不然自然得不到我們想要的結果。顯然網上相關資料很多,過冷水只需要照貓畫虎去做就行了,這個問題so easy!照著他們的方法嘗試即可。
  • java數據類型的強制轉換及相關注意事項
    各位小夥伴們大家好,在上一篇文章中,小編介紹的是數據類型的自動轉換,這次小編要介紹的是數據類型的強制轉換。之前小編有講過,如果數據要進行自動類型轉換,就要符合從小到大的規則,如果不符合從小到大的規則,就無法進行自動類型轉換,如果這個時候就需要用到數據類型的強制轉換。
  • 5000個matlab常見問題錦集的雄關路(001)
    matlab問題錦集系列,力爭收集5000個常見matlab編程問題,每期推送10至30個不等的問題及解答方案,希望對大家的matlab學習有幫助。現在就開5000個matlab問題收集的第一步,本期推送12個問題!1、如何修改 MATLAB 啟動時的工作路徑?至少有以下三種方法:1.MATLAB 主頁->預設->常規,右側可以設置啟動時的工作路徑。
  • Matlab基礎(三)
    其中fsurf指令可以快速繪製符號表達式的三維曲面圖,你只要指定函數表達式,調用該函數就可以很快繪製曲面圖,不需要指定任何數據信息。在matlab中求導的指令為diff(f,var,n),即對函數f的某個變量var求n階導數。
  • 數據處理:Matlab之向量和數組的基本操作
    一文中,我們對matlab做了簡要介紹。本文來說說matlab 中使用數據的常用形式——向量,也就是一維數組。二維數組就是矩陣了,我們下次再寫。向量 (vector)matlab中的向量分為行向量和列向量兩種。行向量的數據之間用逗號或者空格隔開;列向量的數據之間用分號隔開。
  • matlab小例子:秒懂互相關與褶積
    互相關與褶積是勘探地震學和天然地震學中比較常用的一種數據分析手段。在勘探地震學中,往往用褶積模型(地震記錄是子波與地層反射係數的褶積)描述地震記錄的產生;在天然地震學中,常常用互相關來去除震源影響,即A點記錄的地震信號與B點記錄的地震信號的互相關結果(以A為參考)的正支是A點到B點的經驗格林函數,其與真正的格林函數只有振幅上的差異。
  • 【Matlab】繪圖
    反正我們材料剛開始做實驗的時候,同時還在學matlab,對軟體還不熟練,做起來磕磕絆絆的。不過還好第一節實驗課,導師給我們講matlab的一些有關於數據分析的用法(假設)我們看到很多人覺得matlab非常適合數據分析,實際上也確實很多人在用matlab進行數據分析。那我們自己使用matlab進行數據分析並繪圖是個什麼情況呢?
  • 關於Matlab的那些事
    而後由於所學的專業是生命科學和環境相關的東西,用到matlab的機會不多,主要是一些功能用matlab實現起來不是很方便,而且手邊有現成的軟體可以做到,例如圖像分析,還有DNA序列分析都有現成軟體等。本以為不會與其有太多交集。我下決心學習matlab是在經歷幾件事情之後。
  • Matlab教程 | 利用NC文件進行相關係數場的計算及繪製
    希望能幫助到你這個程序是做相關場的。這個的相關場是年數據的,也就是經過計算有N年的夏季數據和N年的nino某一季節的數據!注意這裡的NC文件層數是只有一層的,如果涉及多層要在NC文件讀取那裡改,一般NC文件都是從[ 經度  緯度 層數 時間 ] 這種順序擺放的。