2017-10-17 52 views
2

如何標準化3D矩陣的每個切片?我想是這樣的:標準化3D矩陣的每個切片

a=rand(1,100,3481); 
a= (a - min(a)) ./ (max(a)-min(a)); % 

通過右鍵每個矩陣的片範圍應該從01。但事實並非如此,在某些切片中我找不到1。在我檢查時,min(a)max(a)以3D形式返回了相應的值。因此,使用上面的代碼應該沒有問題。有沒有我錯過的3D矩陣?提前致謝!

+0

你爲什麼要假定每切片會有'1'? – excaza

+0

我正在將這些值歸一化爲「0」和「1」,不應該給我「0」作爲最小值和「1」作爲最大值嗎? –

+0

每個片不保證有數組的最小值和最大值,這是唯一的值將是0和1 – excaza

回答

4

我們需要找到爲每個二維切片的最小值和最大值,然後我們可以在一個量化的方式與幫助使用bsxfun做這些操作從permute讓單身變暗正確對齊,讓bsxfun做它的廣播工作(或在那裏使用reshape)。

因此,實現起來 -

mins = min(reshape(a,[],size(a,3))); 
maxs = max(reshape(a,[],size(a,3))); 
a_offsetted = bsxfun(@minus, a, permute(mins,[1,3,2])); 
a_normalized = bsxfun(@rdivide, a_offsetted, permute(maxs-mins,[1,3,2])) 

樣品輸入,輸出 -

>> a 
a(:,:,1) = 
    2  8  2  2 
    8  3  8  2 
a(:,:,2) = 
    8  1  1  5 
    4  9  8  6 
a(:,:,3) = 
    7  9  3  5 
    6  2  6  5 
a(:,:,4) = 
    9  3  4  9 
    7  1  9  9 
>> a_normalized 
a_normalized(:,:,1) = 
     0 1.0000   0   0 
    1.0000 0.1667 1.0000   0 
a_normalized(:,:,2) = 
    0.8750   0   0 0.5000 
    0.3750 1.0000 0.8750 0.6250 
a_normalized(:,:,3) = 
    0.7143 1.0000 0.1429 0.4286 
    0.5714   0 0.5714 0.4286 
a_normalized(:,:,4) = 
    1.0000 0.2500 0.3750 1.0000 
    0.7500   0 1.0000 1.0000 
+0

這很奇怪,如果您嘗試使用'a = randi([1 10],[1 100 100] )',你的代碼有效。但是,如果您嘗試'a = rand(1,100,100)',則不起作用。這很奇怪 –

+0

@GregorIsack它爲我工作 - 'a = rand(1,100,100)'。你可以仔細檢查? – Divakar

+2

@GregorIsack你如何檢查它的工作與否?不要做'== 0'或'== 1'的事情。這些是浮動的pt值。所以,在那裏使用寬容。例如:'tol = 1e-4;'。然後,執行:all(any(any(abs(a_normalized-0) Divakar

0

我的選擇是不重塑,因爲它有時有點難以理解。我用最小最大您要要使用與repmat克隆正常化的尺寸...:

a=rand(1,100,3481); 

a_min2 = min(a,[],2); 
a_max2 = max(a,[],2); 
a_norm2 = (a - repmat(a_min2,[1 size(a,2) 1])) ./ repmat((a_max2-a_min2),[1 size(a,2) 1]); 

,或者3日昏暗正常化......

a_min3 = min(a,[],3); 
a_max3 = max(a,[],3); 
a_norm3 = (a - repmat(a_min3,[1 1 size(a,3)])) ./ repmat((a_max3-a_min3),[1 1 size(a,3)]);