|
 |
利用MATLAB 7之新功能處理大量資料集(下)
鈦思科技股份有限公司
企劃部專員 黃忻 譯
|
|
資料存取 |
|
讀取純文字檔
新增的 textscan
函式方便您存取任何格式的大型文字檔案。此函式之功能類似於 textread 函式,但加入了指定檔案尋找工具
(file identifier) 之功能,方便使用者在檔案中追蹤及橫越任一檔案指標 (pointer) 。因此您可以一次讀取檔案中的一個區塊,或在不同情況下更改檔案格式。
舉例來說,假設有個文字檔案 - test12_80211b.txt,其中包含數個不同大小的資料區塊,每個區塊的格式如下:
- 兩個標頭敘述
- 一個參數 m
- 一個維度為p x m 的資料表格
下面是檔案test12_80211b.txt的顯示: |
|
* Mobile1
* SNR Vs test No
Num tests=19
,-5.00E+00,-4.00E+00,-3.00E+00,-2.00E+00,...
1.00E+00,6.19E-07,8.63E-07,6.43E-07,1.84E-07,...
2.00E+00,2.88E-07,4.71E-07,6.92E-07,1.43E-07,...
3.00E+00,2.52E-07,8.11E-07,4.74E-07,8.48E-07,...
4.00E+00,...
...
* Mobile2
* SNR Vs test No
Num tests=20
,-5.00E+00,-4.00E+00,-3.00E+00,-2.00E+00,-1.00E+00,0.00E+00,...
1.00E+00,6.19E-07,8.63E-07,6.43E-07,1.84E-07,6.86E-07,3.73E-,...
2.00E+00,...
|
|
您可以使用以下指令以讀入檔案: |
|
fid
= fopen('test12_80211b.txt',
'r'); %
Open text file
InputText = textscan(fid, '%s',
2, 'delimiter', '\n');
% Read header lines
HeaderLines = InputText{1} |
|
HeaderLines
=
'* Mobile1'
'* SNR Vs test No' |
|
InputText
= textscan(fid, 'Num tests=%f');
% Read parameter value
NumCols=InputText{1} |
|
NumCols
=
19 |
|
InputText=textscan(fid,
'%f', 'delimiter',
',' ); %
Read data block
Data=reshape(InputText{1},[],NumCols)';
format short g
Section=Data(1:5,1:5) |
|
Section
=
|
NaN
|
-5
|
-4
|
-3
|
-2
|
1
|
6.19e-007
|
8.63e-007
|
6.43e-007
|
1.84e-007
|
2
|
2.88e-007
|
4.71e-007
|
6.92e-007
|
1.43e-007
|
3
|
2.52e-007
|
8.11e-007
|
4.74e-007
|
8.48e-007
|
4
|
1.97e-007
|
1.64e-007
|
1.38e-007
|
6.17e-007
|
|
|
在提昇的資料存取速度上,新版MATLAB中讀取comma-separated-value
(CSV)檔案的速度可比過去快上一個數量級(order of magnitude)。 |
|
MAT檔案壓縮
MATLAB 7 中的 save
指令會在將MAT檔案寫入到磁碟之前先行壓縮,使得可壓縮 (非隨機) 的資料集佔用更少空間,同時透過網路讀取大型資料檔案之速度亦顯著提昇。 |
|
|
資料儲存效率 |
|
新版的MATLAB
7 可支援整數及單精準度數學運算。這項新功能使您能夠在整數及單精準度資料之原始型態下進行處理,使得記憶體的使用更具效率,且可以處理更大型的非整數資料集。
舉例來說,您可以處理比過去(以雙精準度型態儲存時)多8倍的8-bit整數值。所以在Windows XP平台上(未使用3-GB轉換設定時),過去一律將資料儲存為雙精準度型態時的檔案大小限制為180
MB,而您現在可讀入大小達1.5 GB的8-bit整數值檔案 (註:此為理論上的檔案大小極限,且將會沒有多餘空間可進行運算並儲存結果)。詳細資訊可參考技術專題-
以MATLAB進行整數及單精準度數學運算。 |
|
|
資料處理效能 |
|
提昇的執行速度
MATLAB 7 在處理大型資料集問題方面有多項處理速度的功能提昇。包括由處理器廠商提供,在多數平台版本的MATLAB下均有支援之最佳化Basic
Linear Algebra Subprograms(BLAS)函式庫,如:Intel®
Math Kernel Library (MKL)、AMD
Core Math Library (ACML)、及可由Macintosh的Accelerate
framework取得的BLAS函式庫等。同時,亦採用最新版本的FFTW
(3.0)常式以將FFT相關工作之執行速度極大化。
JIT(Just-In-Time)加速器現在適用於所有數值資料型態,如複數變數及函式呼叫等,提昇更廣範圍MATLAB語言之速度。它同時產生MMX指引以將整數運算之執行最佳化。在處理8-bit整數時,可以使執行速度達雙精準度資料之八倍快。 |
|
|
全新的大型資料集處理功能 |
|
其餘新增支援大型資料集處理的功能包括: |
|
-
進行互動式資料分析時可以在陣列編輯器(array editor)中檢視更大筆的數值陣列 (最多達500,000個元素)
- 巢狀函式現在允許您在內部函式中看到主函式的變數空間(workspace)。這項新功能使您可以在函式間(如在GUI中)共享大型資料集,而不需採用公用(global)變數或將資料以函式參數值之方式傳遞。在下面的範例中,巢狀函式process可以在主函式percentNonzero的變數空間中看到變數如:street1等。 |
|
function
y = percentNonzero(filename, scalevalue, thresholdvalue)
%PERCENTNONZERO
Calculate the percentage of non-zero elements
% P = PERCENTNONZERO('FILENAME',
SCALEVALUE, THRESHOLDVALUE)
% returns the percentage of non-zero
elements in an image read
% from the file FILENAME, scaled
by the value SCALEVALUE and
% thresholded at a value of THRESHOLDVALUE.
%
% Example:
% p=percentNonzero('street1.jpg',1.5,140);
street1 = imread(filename); %
Read image from file
process(scalevalue, thresholdvalue);
% Scale and threshold image
% Find percentage
of non-zero elements
y = 100 * sum(street1(:))/numel(street1);
function
process(scaleval, threshval)
%
Scale image
street1
= street1 * scaleval;
%
Threshold image to create logical array
street1
= street1 > threshval;
end
end |
|
-
全新的M-Lint程式碼檢查器(M-Lint Code Checker)會自動偵測並回報程式中未使用的變數,使您可以將其移除以將記憶體用量減到最小。 |
|
|
總結 |
|
MATLAB
7中包含了許多全新工具及功能以協助您處理大型資料集,使您能夠挑戰更大且更複雜的工程及科學問題,並在更短的時間內將問題解決。 |
|
|
|
|
|
|
|
|
|
|
|
|