2017-10-17 13 views
2

3Dマトリックスの各スライスを正規化するにはどうすればよいですか?私はこのように試してみました:行列の右各スライスすることにより3Dマトリックスの各スライスを標準化する

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

0から1の範囲である必要があります。しかし、そうではありません、私は一部のスライスに1が見つかりません。私が調べたところでは、min(a)max(a)がそれぞれの値を3Dで返しました。したがって、上のコードを使用しても問題ありません。私が3Dマトリックスに欠けていたことはありますか?前もって感謝します!

+0

なぜあなたはすべてのことを想定していますスライスは '1'ですか? – excaza

+0

値を '0'と' 1'に正規化していますが、最小値として '0'、最大値として' 1'を与えてはいけませんか? –

+0

すべてのスライスは配列の最小値と最大値を持つことは保証されません。これは0と1になる唯一の値です – excaza

答えて

4

は、我々は、これらの2Dスライスのそれぞれの最小値と最大値を見つける必要があるし、我々は、シングルトンが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 =ランド(1,100,100)'。ダブルチェックできますか? – Divakar

+2

@GregorIsackどのように動作しているかどうかを確認していますか? '== 0'や' == 1'はしないでください。これらは浮動小数点値です。それで、そこに公差を使ってください。何かのように: 'tol = 1e-4;'。 'すべて(任意の(任意の(abs(a_normalized-0) Divakar

0

私のオプションは、時々理解する少し難しいよう整形なしだろう。私は...あなたはクローンを作成するrepmatを正規化するために使用するディメンションと最小最大を使用する:第3回薄暗い上

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]); 

場合、または正規化を...

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)]); 
関連する問題