如何標準化3D矩陣的每個切片?我想是這樣的:標準化3D矩陣的每個切片
a=rand(1,100,3481);
a= (a - min(a)) ./ (max(a)-min(a)); %
通過右鍵每個矩陣的片範圍應該從0
到1
。但事實並非如此,在某些切片中我找不到1
。在我檢查時,min(a)
和max(a)
以3D形式返回了相應的值。因此,使用上面的代碼應該沒有問題。有沒有我錯過的3D矩陣?提前致謝!
如何標準化3D矩陣的每個切片?我想是這樣的:標準化3D矩陣的每個切片
a=rand(1,100,3481);
a= (a - min(a)) ./ (max(a)-min(a)); %
通過右鍵每個矩陣的片範圍應該從0
到1
。但事實並非如此,在某些切片中我找不到1
。在我檢查時,min(a)
和max(a)
以3D形式返回了相應的值。因此,使用上面的代碼應該沒有問題。有沒有我錯過的3D矩陣?提前致謝!
我們需要找到爲每個二維切片的最小值和最大值,然後我們可以在一個量化的方式與幫助使用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
我的選擇是不重塑,因爲它有時有點難以理解。我用最小最大您要要使用與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)]);
你爲什麼要假定每切片會有'1'? – excaza
我正在將這些值歸一化爲「0」和「1」,不應該給我「0」作爲最小值和「1」作爲最大值嗎? –
每個片不保證有數組的最小值和最大值,這是唯一的值將是0和1 – excaza