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



 

以MATLAB 7進行整數及單精準度數學運算(下)

鈦思科技股份有限公司
企劃部專員 黃忻 譯


 
範例:影像資料之整數數學運算

1. 載入整數影像資料
首先,載入兩個JPEG影像:

street1=imread('street1.jpg');
street2=imread('street2.jpg');
whos street1 street2
 
Name
Size
Bytes
Class
Street1
480x640x3
921600
uint8 array
Street2
480x640x3
921600
uint8 array
共計1843200個元素(elements)使用了1843200位元組。
 
這裡我們可以看到影像為24-bit彩色,以uint8資料格式存成三個平面﹙plane﹚。
 
2. 顯示影像
接著,我們把影像顯示出來:
image(street1);% Display image
axis equal; axis off
 
 
image(street2);% Display image
axis equal; axis off
 
3. 重新按比例分配﹙Scale﹚一張影像
我們可以按一個雙精準度的常數比例分配一張影像,同時仍然保持影像儲存為整數型態之結果,舉例如下:
 
duller = 0.5 * street2;% Scale image with a double constant
whos duller
 
Name
Size
Bytes
Class
Duller
480x640x3
921600
uint8 array
共計921600個元素,使用了921600位元組。
 
接著我們把兩張影像並排呈現。
 
subplot(1,2,1);
image(street2);
axis off equal tight
title('Original'); % Display image

subplot(1,2,2);
image(duller);
axis off equal tight
title('Duller'); % Display image
 
 
4. 把影像相加
最後,把兩張影像相加,並繪出下面這張如同鬼影般的結果。
 
combined = street1 + duller; % Add |uint8| images
clf;
image(combined); % Display image
title('Combined');
axis equal; axis off
 
 
尚未支援的整數運算
MATLAB 7目前不支援複數整數運算及64-bit整數運算。
 
 
MATLAB 7的單精準度數學
 
單精準度資料型態需要以32位元組的記憶體空間儲存,在您不要求計算結果如雙精準度般精準時,非常適合用來儲存及處理實數。

大多數以往支援雙精準度數學運算的MATLAB函式現在也能夠支援單精準度資料,包括算術運算子、線性代數、基本及trig函式、filtering函式及FFTs等﹙完整支援函式列表請參考MATLAB documentation﹚。其餘在處理浮點資料型態﹙包含單精度及雙精度資料﹚時有用的函式包括:realmax、realmin、isfloat(x)、isa(x,'float')、cast、ones、zeros、eye、inf、nan及eps等。單精準度的資料型態在舊版本的MATLAB中即已提供,然而,舊版並不支援用以處理單精準度資料的數學函式及運算子等。
 
使用單精準度數學的好處
藉著使用單精準度型態表示數值而非轉換成雙精準度,您可以處理比過去MATLAB舊版可處理兩倍大的單精準度資料集。單精準度資料也可以用來模擬嵌入式系統﹙如一個32-bit的浮點DSP﹚的精準度。
 
與精準度相關的注意事項
32-bit的單精準度變數大約代表小數點後七位的資料,和雙精準度資料相較下會比較不精確。這樣不精確的特性在表示數值或在牽涉到許多運算的複雜演算法中,容易導致較大的四捨五入誤差。程式設計者在程式中應把這個問題考慮進去。

若要將變數轉換為單精準度資料型態,您必須運用single或cast函式。
 
>> As=single(A) % or
>> As=cast(A,'single');
 
單精準度數學規則
您可以將單精準度型態之數值與雙精準度或單精準度的數值相加。MATLAB會把兩個輸入值都視為單精準度資料進行計算,並回傳一個單精準度的結果。﹙關於MATLAB如何處理單精準度資料與其他型態資料互動的規則完整描述,請參考 MATLAB documentation
 
範例:單精準度數學
 
下面這段M-code提供以單精準度資料進行算術和線性代數運算的範例。
 
建立雙精準度資料
建立一資料集,採用預設的資料型態:雙精準度。
 
Ad = [1 2 0; 2 5 -1; 4 10 -1]
Ad=
     1   2   0
     2   5   -1
     4   10   -1
 
將資料轉換為單精準度型態
利用single函式將資料轉換為單精準度型態。
 
A = single(Ad);
B = single(rand(3,3));
 
建立單精準度的0及1
我們也可以分別利用函式建立單精準度的0和1。
 
n=1000;
Z=zeros(n,1,'single');
O=ones(n,1,'single');
 
我們可以看一下workspace中的變數。
 
whos A B Ad O Z n
 
Name
Size
Bytes
Class
A
3x3
36
single array
B
3x3
36
single array
Ad
3x3
72
double array
O
1000x1
4000
single array
Z
1000x1
4000
single array
N
1x1
8
double array
共計2028個元素,使用了8152位元組。
 
我們可以看到某些變數是單精準度型態,同時變數A﹙單精準度型態表示的Ad﹚只佔用一半的記憶體來儲存,因為單精準度型態只需4位元組﹙32位元﹚,而雙精準度需要8個位元組﹙64位元﹚。
 
進行算術及線性代數運算
我們可以以單精準度型態資料進行算術和線性代數運算。
 
C = A .* B % Elementwise arithmetic
C=
     0.4103   0.7057   0
     1.7873   4.0658   -0.2028
     0.2316   0.0986   -0.1987
 
whos C
 
Name
Size
Bytes
Class
C
3x3
36
single array
共計9個元素,使用了36位元組。
 
我們可以看到這個運算的結果-C為一單精準度資料。以下運算展示更多MATLAB處理單精準度資料之範例。
 
C = A * B % Matrix multiplication
C=
     2.1976   1.9792   0.5444
     5.2309   4.7617   1.0929
     10.5197   9.5333   2.3845
 
A = C / B % Matrix division
A=
     1.0000   2.0000   -0.0000
     2.0000   5.0000   -1.0000
     4.0000   10.0000   -1.0000
 
E = eig(A) % Eigenvalues
E=
     3.7320
     0.2680
     0.9999
 
F = fft(A(:,1)) % FFT
F=
     7.0000
     -2.0000 + 1.7321i
     -2.0000 - 1.7321i
 
P = round(poly(A)) % The characteristic polynomial of a matrix
P=
     1   -5   5   -1
 
Q = conv(P,P) % Convolve two vectors
Q=
     1   -10   35   -52   35   -10   1
 
stem(Q); % Plot the result
 
總結來說,現在MATLAB 7可支援整數及單精準度資料之數學運算,您可以更有效率地儲存這些型態之資料並省去在處理前轉為雙精準度資料之程序。您可以處理跟舊版相比兩倍大的單精準度型態資料集,或利用整數資料型態處理八倍大的整數資料集。您現在可以在MATLAB環境下進行這些運算,免除重新儲存到C、C++或Fortran中處理的麻煩。