Matlab for循环和if语句简化

时间:2016-10-01 16:00:37

标签: matlab loops simplify

您好我正在编写功能,以便在几天内找到行动之间的最大差距。但是我想简化for循环,如果要像Java中的Lambda这样的一个衬里。

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

1 个答案:

答案 0 :(得分: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