3

これは 2 次元では簡単です。たとえば、次のようになります。

>> A = NaN(5,4)
>> A(2:4,2:3) = [1 2; 3 4; 5 6]
>> A(2,2) = NaN                
>> A(4,3) = NaN 

A =

   NaN   NaN   NaN   NaN
   NaN   NaN     2   NaN
   NaN     3     4   NaN
   NaN     5   NaN   NaN
   NaN   NaN   NaN   NaN

>> A(~all(isnan(A),2),~all(isnan(A),1))

ans =

   NaN     2
     3     4
     5   NaN

すべてが NaN ではない行と列の NaN 値が保持されることに注意してください。

これを多次元に拡張するにはどうすればよいですか? たとえば、A に 3 つの次元があるとします。

>> A = NaN(5,4,3)           
>> A(2:4,2:3,2) = [1 2; 3 4; 5 6]
>> A(2,2,2) = NaN                
>> A(4,3,2) = NaN                

A(:,:,1) =

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

A(:,:,2) =

   NaN   NaN   NaN   NaN
   NaN   NaN     2   NaN
   NaN     3     4   NaN
   NaN     5   NaN   NaN
   NaN   NaN   NaN   NaN


A(:,:,3) =

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

どうすれば取得できますか

ans =

   NaN     2
     3     4
     5   NaN

これを 4 次元で行いたいのですが、こちらの例の行列 A よりもはるかに大きな行列を使用します。

4

2 に答える 2

1

AOPによって投稿された入力に基づく問題の私の解決策:

>> [i,j,k] = ind2sub(size(A),find(~isnan(A)));
>> l = min([i j k]);
>> u = max([i j k]);
>> B=A(l(1):u(1),l(2):u(2),l(3):u(3))
B =
   NaN     2
     3     4
     5   NaN
>> size(B)
ans =
     3     2

これをはるかに大きな行列で実行したいとおっしゃっていたので、@ronalchnのソリューションのパフォーマンスについてはよくわかりません。これがすべてのall呼び出しです。しかし、私はそれがどの程度重要であるかわかりません-多分誰かがコメントすることができます...

于 2012-08-19T20:45:36.567 に答える
1

これを試して:

2次元

A(~all(isnan(A),2),~all(isnan(A),1))

3次元

A(~all(all(isnan(A),2),3),...
  ~all(all(isnan(A),1),3),...
  ~all(all(isnan(A),1),2))

4次元

A(~all(all(all(isnan(A),2),3),4),...
  ~all(all(all(isnan(A),1),3),4),...
  ~all(all(all(isnan(A),1),2),4),...
  ~all(all(all(isnan(A),1),2),3))

基本的に、ルールは N 次元用です。

  • すべての N 次元で isnan() を実行します。

  • 次に、 all() 関数で N-1 回ラップします。

  • また、i 次元の all() 関数のそれぞれの 2 番目の引数は、任意の順序で 1 から N までの数字にする必要がありますが、i は除きます。


Theodros Zelleke は、誰のメソッドがより高速であるかを知りたがっているので (彼は自分のメソッドが非常に高速であると考えています)、ベンチマークを示します。行列 A は次のように定義されます。

A = NaN*ones(100,400,3,3);
A(2:4,2:3,2,2) = [1 2; 3 4; 5 6];
A(2,2,2,2) = NaN;A(4,3,2,2) = NaN;
A(5:80,4:200,2,2)=ones(76,197);

彼のテストは次のように定義されています。

tic;
for i=1:100
[i,j,k,z] = ind2sub(size(A),find(~isnan(A)));
l = min([i j k z]);
u = max([i j k z]);
B=A(l(1):u(1),l(2):u(2),l(3):u(3),l(4):u(4));
end
toc

結果:

Elapsed time is 0.533932 seconds.
Elapsed time is 0.519216 seconds.
Elapsed time is 0.575037 seconds.
Elapsed time is 0.525000 seconds.

私のテストは次のように定義されています:

tic;
for i=1:100
isnanA=isnan(A);
ai34=all(all(isnanA,3),4);
ai12=all(all(isnanA,1),2);
B=A(~all(ai34,2),~all(ai34,1),~all(ai12,4),~all(ai12,3));
end
toc

結果:

Elapsed time is 0.224869 seconds.
Elapsed time is 0.225132 seconds.
Elapsed time is 0.246762 seconds.
Elapsed time is 0.236989 seconds.
于 2012-08-19T13:59:24.393 に答える