2016-11-28 40 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] 

然后将生成矩阵应该是:

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] 

不知道如何这样的事情CSN做什么? (我原来的3个昏暗的矩阵很大)

谢谢!

回答

6

内置的triu无法处理这个3D数组,但你可以在一个简单的循环中完成。

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

您可以生成一个二维面具,permute其尺寸,并与单扩展乘用bsxfun

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

或者,从版本R2016b开始,你可以删除bsxfun感谢automatic singleton expansion

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

我会尝试,现在的感谢! – user135172

1

假设你有一个“方形”三维矩阵(即NxNxN,就像你在原始文章中的3x3 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; 

我也做了三个建议的解决方案的快速比较。 @ 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.