簡體   English   中英

Matlab for循環和if語句簡化

[英]Matlab for loop and if statement simplification

您好,我正在編寫函數,以查找幾天內動作之間的最大差距。 但是我想簡化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

此處的主要任務是找到間隙,即data兩個后續條目之間的差異。 這可以通過diff函數有效地完成:只需調用diff(data)

剩下的只是創建正確的輸出:我們必須對后代中的缺口進行排序,例如使用sort函數。 注意:我們也使用sort的第二個輸出,即索引。

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

接下來,我們創建一個包含所有輸出的單元格數組(將所有data條目轉換為datestr並將它們放入單元格中。向該單元格數組中添加datestr 。最后轉置以使所有日期位於第一行,所有空格位於第二行行):

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

並讓所有內容都通過fprintf函數運行:

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

不幸的是,這不是一線做法,但它仍然刪除了所有的for和if。 這是一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM