 |
以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中處理的麻煩。 |
|
|
|
|