2017-05-06 63 views
0

此代碼(幾乎)做我想要的,但我不明白它如何可以如此簡單。那麼,請有人向我解釋這個代碼的工作原理嗎?這是什麼:uint8((double(weather1618)./ maxv)。* 50);?

FIY,weather1618是一個384x384陣列,範圍從-76到-30。而maxv的值爲-30。

mapped_array = uint8((double(weather1618) ./ maxv) .* 50); 
image(mapped_array); 

爲什麼。* 50。* 100給出不同的圖像,但。* 100。* 500。* 1000是相同的?

enter image description here

如果我是直接做,

image(weather1618); 

我只會得到一個藍色的圖像。

enter image description here

+0

class(weather1618)'返回什麼? – codeaviator

+1

如果該行正在做的唯一事情是準備'image'數據,那麼您可以用'imshow(weather1618,[])'或'imagesc(weather1618)' –

+0

@codeaviator'double' – katarado

回答

3

此代碼(幾乎)我想要做什麼,但我不明白怎麼能 那麼簡單。那麼請有人可以向我解釋這個代碼 的工作原理嗎?

請注意,這類問題一般是not the best fit for Stack Overflow。但是,由於您已縮小了您不明白的代碼行,因此我會向您解釋。

你提到:

FIY,weather1618是384x384陣列的範圍從-76至-30℃。 而maxv的值爲-30。

代碼的第一行:

mapped_array = uint8((double(weather1618) ./ maxv) .* 50); 

調用以下功能/操作符:

  • double(功能) - 轉換爲雙精度
  • ./(操作者) - 元-wise division
  • .*(operator) - Ele換貨態乘法
  • unit8(功能) - 轉換爲8位無符號整數

這是怎麼回事:

  1. double(weather1618)weather1618矩陣​​轉換,所以矩陣的值現在是十進制數。在MATLAB中,double值可以表示-1.79769e + 308到-2.22507e-308之間的負值,而從正值(source)可以從2.22507e-308到1.79769e + 308。做這種轉換的可能原因是在步驟2中避免integer division(下面解釋)。
  2. ./ maxv將矩陣的每個元素除以-30。這將翻轉矩陣的每個元素的符號,並將數據縮放1/30。由於矩陣在前一步中轉換爲double,所以在除法後得到的數組也將是double類型的,並且它將包含十進制數。
  3. .* 50將矩陣的每個元素乘以50.這將按比例縮放數據50.在乘法之後獲得的數組將繼續爲double類型,如前所述。
  4. uint8(...)從型雙鍵入UINT8(unsigned integer)的矩陣轉換,所以矩陣的值現在將範圍從0到255

代碼的第二行:

image(mapped_array); 

調用image函數以顯示步驟4中獲得的陣列圖像。

如果我是直接做,

image(weather1618); 

我只會得到一個藍色的圖像。

很好的發現!之所以只看到藍色圖像是因爲image功能默認情況下不使用colormap中的全部顏色範圍,因此即使信息存在於圖像中,也無法區分它,因爲它是沒有使用全部顏色顯示。另一方面,imagesc函數默認使用全範圍的顏色。

看一看這個例子中,我提出:

img = rand(50);  % Random image with values from 0 to 1. 

subplot(1, 2, 1); % Left plot. 
image(img);   % Display image from array. 
colorbar;   % Colorbar showing color scale. 

subplot(1, 2, 2); % Right plot. 
imagesc(img);  % Display image with scaled colors. 
colorbar;   % Colorbar showing color scale. 

image vs imagesc

他們都是相同的圖像,但顏色縮放是不同的(看colorbars)。

又爲何.*50.*100給出不同的圖像,但.*100.*500.*1000是相同的?

因爲那uint8能夠存儲的最大值是255,因此大於255將被截斷爲255。這就是爲什麼由100,500和1000乘以任何值都沒有區別所有的,因爲所獲得的值都超過255.

+0

完全替換它!我覺得我學到了很多東西!感謝您花時間清楚地解釋我! :d – katarado

相關問題