2012-08-19 2 views
2

이것은 예를 들어, 2 차원 쉽다 : NaN의 모든 NaN의 유지된다없는 행과 열로 값 것을n 차원 배열에서 선행 및 후행 NaN 값을 잘라내는 방법은 무엇입니까?

>> 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 

참고.

여러 치수로 확장하는 방법은 무엇입니까? 그때

ans = 

    NaN  2 
    3  4 
    5 NaN 
내가 네 가지 차원에서이 작업을 수행하고 싶습니다

, 여기에 예 행렬 A보다 훨씬 더 매트릭스로 얻을 어떻게

>> 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 

예를 들어 A는 세 가지 차원이있는 경우.

+0

'A = NaN (5,4)'를 할 수 있다는 것을 알고 계셨습니까? Matlab에서 'NaN'은 double 및 matrix 생성 명령입니다. –

+0

아니요. 감사! –

답변

1

입력 A에 따라 문제에 대한 내 솔루션 영업 이익에 의해 게시 된 : 당신은 당신이 내가의 성능에 대한 확실하지 않다 훨씬 더 큰 행렬이 작업을 수행 할 수 있음을 언급 한 이후

>> [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- 호출입니다. 그러나 나는 그 문제를 확장하는 것에 대해 아무 것도 모른다. 어쩌면 누군가가 주석을 달 수있다.

+0

가 솔루션에 정의되어 있지 않습니다. 알고리즘 성능을 추정하는 방법을 분명히 알지 못합니다. 'all' 호출은'isnan' 호출보다 시간이 덜 걸릴 것입니다 - 알고리즘 복잡도가 같으면 MATLAB은 아마도 비트 세트를 구현합니다. – ronalchn

+0

's'를'size (A)'로 변경했습니다. – ronalchn

0

이 시도 :

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 차원

01 2,311,

기본적으로 규칙은 N 차원입니다 : 당신이 때는 isNaN() 일을 모든 N 크기에

  • 합니다. ,

  • 는 그 후, 전체() 함수는 N-1 회

  • 그것을에 감아 제 2 인수는 i 번째 차원의 전체() 함수의 각각은 임의의 순서로 N에 숫자 1이되어야 그러나 i 제외.


    테오 드 로스 테 Zelleke가 그 방법을 빠른 (그는 그의 방법은 너무 빨리하다고 생각 말하는 좋은 방법)입니다보고 싶어하기 때문에

, 여기에 벤치 마크입니다.행렬 A를 같이 정의 : 결과와

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.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 
[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 

:

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

그의 테스트로 정의

Elapsed time is 0.224869 seconds. 
Elapsed time is 0.225132 seconds. 
Elapsed time is 0.246762 seconds. 
Elapsed time is 0.236989 seconds. 
+0

지옥처럼 추악하지만 ... 나는 여기에 갈 수있는 유일한 방법이라고 생각한다. :) –

+0

해결책의 성능에 의문을 제기하는 사과, 분명히하는 것에 대한 사과 ... 그래서 '모든 것'이 매우 빠르다는 사실을 배웠다. 여기 ...하지만 내 코드가'ind2sub' 호출에서 시간을 잃었습니까? –

+0

시차는 실제로 중요하지 않으며 인위적입니다. 같은 크기의 매트릭스 인 경우에도 여러 가지 요인에 따라 속도가 달라집니다. 실제로 더 빠른 메서드는 NaN 값의 수와 NaN/NaN 이외의 값이 어디에 있는지에 따라 다릅니다. 중요한 것은 둘 다 같은 "알고리즘 복잡성"과 대략 동일한 상수를 갖는다는 것입니다. 예. 둘 다 비슷한 양의 시간이 소요됩니다 (시간은 3 배 이상 차이가 없음) – ronalchn