2017-10-17 54 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)]);