2016-10-01 3 views
0

안녕하십니까. 일 사이에 가장 큰 간격을 찾기 위해 함수를 작성하고 있습니다. 하지만 루프를 단순화하고 자바에서 람다 (Lambda)와 같은 하나의 라이너 (liner)를 만들고 싶습니다.Matlab for 루프 및 if 문 단순화

function [retObj] = find_gaps (data, n) 

[~,n1] = size(data); 
dates = 1; 
gaps = 1; 
for i = 1:n1 
    if i > 1 
    gap = data(i) - data(i-1); 
    dates(end+1) = data(i-1); 
    gaps(end+1) = gap; 
    end 
end 
dates(1) = []; 
gaps(1) = []; 

fprintf('Highest gaps:\n'); 
for i = 1:n 
    [val,key] = max(gaps); 
    fprintf('%s gap: %d\n',datestr(dates(key)), val); 
    gaps(key) = []; 
    dates(key) = []; 
end 
+2

Oneliners이 과대 평가 결과 : 다음은 예입니다. 그냥 말해. 코드를 훨씬 더 효율적으로 만들 수는 없습니다. –

+0

예, 아마이 코드를보다 효율적으로 만드는 방법에 대한 질문이 있어야 할 것입니다. – user3476593

+1

키워드 : 사전 할당 ('dates'와'gaps'), 중복 (첫 번째 루프에서'i = 2 '의 루프, 필요하다면'no ','dates '와'data '가 같을 수 있음), 벡터화 ('gaps = diff (data);'대신에). –

답변

0

여기서 주된 작업은 간극 data 두 후속 항목 사이, 즉 차이를 확인하기위한 것이다. 이 작업은 diff 함수를 사용하여 효율적으로 수행 할 수 있습니다. diff(data)을 호출하면됩니다.

나머지는 올바른 출력을 만드는 것입니다. 예를 들어 자손에서 갭을 정렬해야합니다. sort 기능이 있습니다. 참고 : 색인 인 두 번째 출력 인 sort도 사용합니다.

[gap, ind] = sort(diff(data), 'descend'); 

다음으로, 우리는 모든 출력 (datestr 모든 data 항목을 변환하고 셀에 넣어를 포함하는 셀 배열을 만들 수 있습니다. 해당 셀 배열 간격을 추가합니다. 마지막으로 모든 날짜가 첫 번째 행에있을 수 있도록 트랜스 두 번째 행의 모든 ​​격차) 다음 fprintf 기능을 통해 실행

out = [ cellstr(datestr(data(ind).')), 
     mat2cell(gap.',ones(1,numel(gap))) 
     ].'; 

그리고하자 모든 :

fprintf('%s gap: %d\n', out{:}) 

불행히도 단 하나의 라이너는 아니지만 여전히 모든 것을 제거합니다.

data = [1000, 1001, 1002, 1005, 1006, 1018, 1019, 1021]; 

[gap, ind] = sort(diff(data), 'descend'); 
out = [cellstr(datestr(data(ind).')), mat2cell(gap.',ones(1,numel(gap)))].'; 
fprintf('%s gap: %d\n', out{:}) 

02-Oct-0002 gap: 12 
28-Sep-0002 gap: 3 
15-Oct-0002 gap: 2 
26-Sep-0002 gap: 1 
27-Sep-0002 gap: 1 
01-Oct-0002 gap: 1 
14-Oct-0002 gap: 1