MATLAB(六)数据处理
一、Matlab中的默認數據文件mat文件
例1、把Matlab工作空間中的數據矩陣a、b、c保存到數據文件data1.mat中。
>> a = [1, 2, 3] a =1 2 3 >> b = [4, 5, 6] b =4 5 6 >> c = [7, 8, 9] c =7 8 9 >> save data1 a b c例2、把例1生成的data1.mat中的所有數據加載到Matlab工作空間中。
>> load('data1.mat')二、純文本文件
可以把word文檔中整行整列的數據粘貼到純文本文件,然后調入到Matlab工作空間中。
例3、把純文本文件data2.txt加載到工作空間。
>> a = load('data2.txt') a =1 2 3 4 56 7 8 9 10或者用textread() 函數,加載數據到工作空間,需要注意加載數據的類型
>> a = textread('data2.txt') a =1 2 3 4 56 7 8 9 10如果數據不是規(guī)則的,則這兩個函數的處理還是有差別的,textread()函數會自動對缺失的數據用0進行填補,而load函數直接報錯;
>> a = load('data2.txt') 錯誤使用 load ASCII 文件 data2.txt 的第 2 行中的列數必須與前面行中的列數相同。 >> a = textread('data2.txt') a =1 2 34 5 0例4、使用dlmwrite命令把矩陣b保存到純文本文件data3.txt中。
>> b = [1 2 3] b =1 2 3 >> dlmwrite('data3.txt', b)例5、生成服從標準正太分布隨機數的100x200矩陣,然后用fprintf命令保存到純文本文件data4.txt中。
clc, clear fid = fopen('data4.txt', 'w'); a = normrnd(0, 1, 100, 200); %0,1表示的是隨機數的取值范圍 fprintf(fid, '%f\n', a'); % 將產生的數據a保存到打開的data4.txt文件中 fclose(fid); % 關閉data4.txt文件?
注:對于高維矩陣用dlmwrite構造的純文本文件,Lingo軟件不識別;為了Lingo軟件識別,純文本文件必須用fprintf構造,而且數據之間的分割符為“\n”。
三、Excel文件
例6、把一個5x10矩陣寫到Excel文件data5.xls表單Sheet2中B2開始的域中。
clc, clear a = rand(5, 10); xlswrite('data5.xls', a, 'Sheet2', 'B2')例7、把例6生成的Excel文件data5.xls中表單Sheet2的域“C3:F6”中的數據賦值給b。
>> b = xlsread('data5.xls', 'Sheet2', 'C3:F6') b =0.231662966604022 0.989774818941714 0.782489349911504 0.1458589734751690.209023331509194 0.722841980854519 0.646446071734880 0.7180582712878980.609870564311474 0.828393537955305 0.991485577448960 0.2874756020793170.612317772839133 0.365553588875753 0.775034954080905 0.603066961251474四、字符串數據
例8、統(tǒng)計下列五行字符串中字符a、c、g、t出現的頻數。
clc, clear fid = fopen('data6.txt', 'r'); i = 1; while(~feof(fid))data = fgetl(fid);a = sum(data == 97);b = sum(data == 99);c = sum(data == 103);d = sum(data == 116);e = sum(data >= 97 & data <= 122);f(i, :) = [a b c d e a+b+c+d];i = i + 1; end f he = sum(f) fclose(fid); f =2 0 5 1 65 82 3 5 3 62 132 3 2 2 58 95 3 4 0 64 126 5 2 3 63 16 he =17 14 18 9 312 58其他的一些字符串處理命令有strcmp、strfind等。
五、圖像文件
例9、把一個比較大的bmp圖像文件data7.bmp,轉化成比較小的jpg文件,命名為data7.jpg,并顯示。
clc,clear a = imread('data7.bmp'); imshow(a) imwrite(a, 'data7.jpg'); figure imshow('data7.jpg')?例10、生成10幅彩色jpg文件,依次命名為jpg1.jpg,......,jpg10.jpg。
clc,clear for i = 1:10str = ['jpg', int2str(i), '.jpg'];a(:,:,1) = rand(500);a(:,:,2) = rand(500) + 100;a(:,:,3) = rand(500) + 200;imwrite(a, str); end六、數據的批處理
例11、現有數據文件book1.xls,......,book5.xls,用命令importdata讀入數據。
clc,clear n = 5; mydata = cell(1, n); for k = 1:nfilename = sprintf('book%d.xlsx', k); % 構造文件名的格式化字符串mydata{k} = importdata(filename); % 從文件導入數據 end celldisp(mydata) % 顯示細胞數據的數據注意:xls文件必須是微軟office創(chuàng)建的文件,否則,讀取文件時會出現錯誤。?
mydata{1} =data: [1×1 struct]textdata: [1×1 struct]rowheaders: [1×1 struct] mydata{2} =data: [1×1 struct]textdata: [1×1 struct]rowheaders: [1×1 struct] mydata{3} =data: [1×1 struct]textdata: [1×1 struct]rowheaders: [1×1 struct] mydata{4} =Sheet1: {'8iiy8u'} mydata{5} =Sheet1: {'uykyu' 'j546'}例12、現有數據文件book01.xls,...,book05.xls,讀取各Excel文件的第1個表單(Sheet1)的域“A2:C10”的數據。
clc,clear n = 5; range = 'A2:C10'; sheet = 1; myData = cell(1, n); for k=1:nfileName = sprintf('book0%d.xls', k);myData{k} = xlsread(fileName, sheet, range); end celldisp(myData) % 顯示細胞數組的數據 myData{1} =1 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 11 1 1 myData{2} =2 2 22 2 22 2 22 2 22 2 22 2 22 2 22 2 22 2 2 myData{3} =3 3 33 3 33 3 33 3 33 3 33 3 33 3 33 3 33 3 3 myData{4} =4 4 44 4 44 4 44 4 44 4 44 4 44 4 44 4 44 4 4 myData{5} =5 5 55 5 55 5 55 5 55 5 55 5 55 5 55 5 55 5 5例13、讀入當前目錄下所有后綴名為xls的Excel文件的數據。
clc,clear fi = dir('*.xls'); % 提出Excel文件的信息,返回值是結構數據 n = length(fi); % 計算Excel文件的個數 myData = cell(1, n); for k = 1:nmyData{k} = importdata(fi(k).name); end celldisp(myData) % 顯示細胞數組的數據 myData{1} =Sheet1: [9×3 double] myData{2} =Sheet1: [9×3 double] myData{3} =Sheet1: [9×3 double] myData{4} =Sheet1: [9×3 double] myData{5} =Sheet1: [9×3 double] myData{6} =data: [1×1 struct]textdata: [1×1 struct]rowheaders: [1×1 struct] myData{7} =data: [1×1 struct]textdata: [1×1 struct]rowheaders: [1×1 struct] myData{8} =data: [1×1 struct]textdata: [1×1 struct]rowheaders: [1×1 struct] myData{9} =Sheet1: {'8iiy8u'} myData{10} =Sheet1: {'uykyu' 'j546'} myData{11} =Sheet2: [5×10 double]七、時間序列數據
例14、時間序列數據的處理
clc,clear randn('seed', sum(100*clock)); % 初始化隨機數發(fā)生器 a = randn(6, 1); % 生成服從標準正太分布的偽隨機數 b = [today:today+5]' % 從今天到后面5天 fts = fints(b,a) % 生成fints格式數據 fts(3) = NaN; % 將第三個數據變?yōu)槿笔е?newdata = fillts(fts, 'linear') % 用線性插值填補時間序列中的缺失數據 data = fts2mat(newdata) % 時間序列數據轉為普通數據 b =737538737539737540737541737542737543fts = desc: (none)freq: Unknown (0)'dates: (6)' 'series1: (6)' '23-Apr-2019' [ 0.886860381620918]'24-Apr-2019' [ 0.460999512887512]'25-Apr-2019' [-0.215670586672620]'26-Apr-2019' [-0.009709957146119]'27-Apr-2019' [-0.726552476730568]'28-Apr-2019' [ 0.090572270848305]newdata = desc: Filled freq: Unknown (0)'dates: (6)' 'series1: (6)' '23-Apr-2019' [ 0.886860381620918]'24-Apr-2019' [ 0.460999512887512]'25-Apr-2019' [ 0.225644777870696]'26-Apr-2019' [-0.009709957146119]'27-Apr-2019' [-0.726552476730568]'28-Apr-2019' [ 0.090572270848305] data =0.8868603816209180.4609995128875120.225644777870696-0.009709957146119-0.7265524767305680.090572270848305例15、對于Matlab當前工作路徑下所有時間序列型的純文本文件,進行相關的數據操作。
clc,clear tf = dir('*.txt') % 提出純文本文件的信息,返回值是結構數據 n = length(tf); % 計算純文本文件的個數 fts = ascii2fts(tf(1).name); % 讀第一個文件中的時間序列數據 fts = extfield(fts, {'series2', 'series3'}); % 提出第二個字段和第三個字段 for i=2:ntp1 = ascii2fts(tf(i).name); % 讀取時間序列數據tp2 = extfield(fts, {'series2', 'series3'}); % 提出第2,3字段str1 = ['series', num2str(2*i)];str2 = ['series', num2str(2*i+1)];tp3 = fints(tp2.dates, fts2mat(tp2), {str1,str2}); % 把時間序列改名fts = merge(fts, tp3); % 合并兩個時間序列的數據 end fts % 顯示合并提出的兩個字段數據八、日期和時間
Matlab日期和時間的函數有datenum,datevec,datestr,now,clock,date,calendar,eomday,weekday,addtodate,etime等,這里就不一一說明各個函數的用法了,下面舉例說明有關函數的使用。
例16、統(tǒng)計1601年1月到2000年12月,每月的13日分別出現在星期日、星期一、星期二,...,星期六的頻數,并畫出對應的柱狀圖。注:Matlab中weekday的1對應“星期日”,2對應“星期一”,......,7對應“星期六”。
clc,clear c = zeros(1,7); for y=1601:2000for m=1:12d = datenum(y, m, 13);w = weekday(d);c(w) = c(w) + 1;end end c,bar(c) %顯示頻數并畫出頻數的柱狀圖 axis([0 8 680 690]) line([0, 8], [4800/7, 4800/7], 'linewidth', 4, 'color', 'k') set(gca, 'xticklabel', {'Su', 'M', 'Tu', 'W', 'Th', 'F', 'Sa'}) c =687 685 685 687 684 688 684九、視頻文件
? ? ? ? Matlab除了支持各種圖像文件的讀寫等操作,還支持視頻文件的相應處理。實際上,視頻文件本質上是由多幀具有一定大小、順序、格式的圖像組成的,只是一般的圖像是靜止的,而視頻是可以將多幀靜止的圖像進行連續(xù)顯示,從而達到動態(tài)效果。
例17、讀取一個視頻文件text.mp4,并把視頻中的每一幀保存成jpg文件。
clc,clear ob = VideoReader('test.mp4') % 讀取視頻文件對象 get(ob) % 獲取視頻對象的參數 n = ob.NumberOfFrame; % 獲取視頻的總幀數 for i = 1:na = read(ob, i); % 讀取視頻對象的第i幀imshow(a) % 顯示第i幀圖像str = ['source\', int2str(i), '.jpg']; % 構造文件名的字符串,目錄source要提前建好imwrite(a, str); % 把第i幀保存到jpg文件 end ob = VideoReader (具有屬性):常規(guī)屬性:Name: 'test.mp4'Path: 'D:\matlab_workspace\文件夾3\數據處理'Duration: 9.945333000000000CurrentTime: 0Tag: ''UserData: []視頻屬性:Width: 320Height: 176FrameRate: 25BitsPerPixel: 24VideoFormat: 'RGB24' obj = VideoReader (具有屬性):常規(guī)屬性:Name: 'test.mp4'Path: 'D:\matlab_workspace\文件夾3\數據處理'Duration: 9.945333000000000CurrentTime: 0Tag: ''UserData: []視頻屬性:Width: 320Height: 176FrameRate: 25BitsPerPixel: 24VideoFormat: 'RGB24'?
?
總結
以上是生活随笔為你收集整理的MATLAB(六)数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10下VS2013+OpenCV2
- 下一篇: reload vue 重新加载_vue面