2016-10-01 389 views
0

你好我正在写函数来查找在几天的行动之间的最大差距。但我想简化循环,如果像Java中的Lambda一样。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

关键词:预分配('日期'和'间隙'),冗余(从第一个循环中的“i = 2”开始循环,如果需要则不需要;“日期”和“数据”可能相同),向量化('gap = diff(data);'而不是循环)。 –

回答

0

这里的主要任务是找到差距,即data中两个后续条目之间的差异。这可以通过diff功能高效完成:只需拨打diff(data)即可。

其余的仅仅是创造正确的输出:我们必须对后裔的差距进行排序,例如,与sort函数。注意:我们也使用第二个输出sort,这是索引。

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

接下来,我们创建一个包含所有输出(所有data条目转换为datestr,并把它们放入一个单元一个单元阵列添加将差距缩小到那个单元阵列,最后转,让所有日期是在第一行,第二行中的所有空隙):

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

并让一切通过fprintf功能运行:

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