此代碼(幾乎)我想要做什麼,但我不明白怎麼能 那麼簡單。那麼請有人可以向我解釋這個代碼 的工作原理嗎?
請注意,這類問題一般是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位無符號整數
這是怎麼回事:
double(weather1618)
的weather1618
矩陣轉換,所以矩陣的值現在是十進制數。在MATLAB中,double值可以表示-1.79769e + 308到-2.22507e-308之間的負值,而從正值(source)可以從2.22507e-308到1.79769e + 308。做這種轉換的可能原因是在步驟2中避免和integer division(下面解釋)。
./ maxv
將矩陣的每個元素除以-30。這將翻轉矩陣的每個元素的符號,並將數據縮放1/30。由於矩陣在前一步中轉換爲double,所以在除法後得到的數組也將是double類型的,並且它將包含十進制數。
.* 50
將矩陣的每個元素乘以50.這將按比例縮放數據50.在乘法之後獲得的數組將繼續爲double類型,如前所述。
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.
他們都是相同的圖像,但顏色縮放是不同的(看colorbars)。
又爲何.*50
和.*100
給出不同的圖像,但.*100
, .*500
和.*1000
是相同的?
因爲那uint8
能夠存儲的最大值是255,因此大於255將被截斷爲255。這就是爲什麼由100,500和1000乘以任何值都沒有區別所有的,因爲所獲得的值都超過255.
class(weather1618)'返回什麼? – codeaviator
如果該行正在做的唯一事情是準備'image'數據,那麼您可以用'imshow(weather1618,[])'或'imagesc(weather1618)' –
@codeaviator'double' – katarado