2016-11-28 15 views
3

3次元行列の '下三角形'をリセットする必要があります。 3次元行列の下三角形をリセットする方法

C(:,:,1) = [1 2 3 ; 2 4 6 ; 3 6 9] 

C(:,:,2) = [2 4 6 ; 4 8 12 ; 6 12 18] 

C(:,:,3) = [3 6 9 ; 6 12 18 ; 9 18 27] 

は、次いで、得られた行列は次のようになります:そのようなことのCSNは

C(:,:,1) = [1 2 3 ; 2 4 6 ; 3 6 9] 

C(:,:,2) = [0 0 0 ; 4 8 12 ; 6 12 18] 

C(:,:,3) = [0 0 0 ; 0 0 0 ; 9 18 27] 

任意のアイデアをどのように行うことが これは、元の行列がある場合という、意味しますか? (私の元の3つの濃淡マトリックスが大きい)

ありがとう!

答えて

6

組み込みのtriuはこの3D配列を処理できませんが、単純なループで行うことができます。

for k = 2:size(C, 3) 
    C(1:k-1,:,k) = 0; 
end 
4

あなたは、2Dマスクを生成permuteその寸法、およびbsxfunを使用してシングルトン拡大を掛けることができます:

result = bsxfun(@times, C, permute((1:size(C,1)).'>=(1:size(C,2)), [1 3 2])); 

または、バージョン以降R2016bから、あなたはautomatic singleton expansionbsxfunおかげで削除することができます。

result = C .* permute((1:size(C,1)).'>=(1:size(C,2)), [1 3 2]); 
+0

私は今、感謝をしようとします! – user135172

1

「正方形の」3次元マトリックス(元の3x3のポストにあるようにNxNxN x3)あなたはまた、再形成と再作成を使うことができます:

編集:repmatが遅すぎるので、私はbsxfun実装のためにそれを入れ替えました。

[a,b,c] = size(C) 
D = reshape(tril(ones(a)),[a,1,a]); 
F = ones(1,size(E,1)); 
D = bsxfun(@times,D,F); 
C(~D)=0; 

また、3つの提案された解決策を簡単に比較しました。 @ LuisMendoの解決策は私のためには機能しません。> =比較(サイズ[1 N]と[N 1]を比較する)に行列次元誤差があります。私の間Sueverのソリューション@

は、彼を大幅に高速化され:

Comparing the three methods with variable size Cs: 
Suever's version (for loop): 
Took 0.3529s to compute. 
Took 0.0002s to compute size 3x3x3. 
Took 0.0008s to compute size 10x10x10. 
Took 0.0008s to compute size 50x50x50. 
Took 0.0455s to compute size 250x250x250. 
Took 0.3055s to compute size 500x500x500. 
My version (reshape/repmat): 
Took 0.9086s to compute. 
Took 0.0522s to compute size 3x3x3. 
Took 0.0042s to compute size 10x10x10. 
Took 0.0017s to compute size 50x50x50. 
Took 0.1060s to compute size 250x250x250. 
Took 0.7445s to compute size 500x500x500. 
関連する問題