2017-03-28 17 views
2

私はMatlabの初心者です。次元がjの場合はどこでも、NaNの値を(j、k、l)の配列に代入したいと思います。< kまたはj < l。これを最も効率的に行うにはどうすればいいですか?Matlabの値j <kにNaNを代入する方法

答えて

4

あなたが効率的にそれを行うにはbsxfunを使用することができます:あなたは、単に書くことができ

J = (1:size(A,1)).'; 
K = 1:size(A,2); 
L = reshape(1:size(A,3),1,1,[]); 
A(bsxfun(@or,bsxfun(@lt,J,K),bsxfun(@lt,J,L))) = NaN; 

をMATLAB r2016bでまたはオクターブ:

________________________________ 
| METHOD | MEMORY | SPEED | 
|==========|==========|==========| 
| MESHGRID | 1547 MB | 1.24 Secs| 
|----------|----------|----------| 
| BSXFUN | 57 MB | 0.18 Secs| 
|__________|__________|__________| 
:マトリックス A = rand(500,400,300)のテストの

J = (1:size(A,1)).'; 
K = 1:size(A,2); 
L = reshape(1:size(A,3),1,1,[]); 
A(J<K|J<L)=NaN; 

結果

+0

偉大な答え!!! –

+0

@AnderBiguriありがとう、時々チャンスが役に立ちます:)。 – rahnema1

3

使用ファンシーvecotization:

% this may be memory expensive for big matrices: 
[j,k,l]=meshgrid(1:size(A,1),1:size(A,2),1:size(A,3)); 

% Tada! 
A(j<k | k<l)=NaN; 

にあなたが十分なRAMを持っていない(または、このためにそれを使用したくない)場合は、最良のオプションはちょうど愚かである:

for jj=1:size(A,1) 
    for k=1:size(A,2) 
     for l=1:size(A,3) 
      if (jj<k | k<l) 
       A(jj,k,l)=NaN; 
      end 
     end 
    end 
end 

これはおそらく遅くなりますが、余分なメモリは必要ありません。

+0

偉大な、それを使用します!あなたはそれが高価なメモリだと言います - あなたは大きな行列のための他のソリューションよりも推奨しますか? – LenaH

+0

@LenaH更新済み! –

+0

スーパー。それは私が持っていたものです。私の記憶が速いもののために十分であるかどうかを見ます。 – LenaH

関連する問題