公司簡介 產品資訊 教育訓練 活動資訊 鈦思書網 技術支援 工程師俱樂部 會員登入



 

利用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中包含了許多全新工具及功能以協助您處理大型資料集,使您能夠挑戰更大且更複雜的工程及科學問題,並在更短的時間內將問題解決。