滑动窗口,用于查找 MATLAB 2014a 中的最小值



我是 MATLAB 的新手,我想知道有什么方法可以执行以下操作:

  • 获取我的数据中每 180 个样本中最小值的索引列表,长度为 18000 个样本

这就是我以前在Python中(使用numpy.where(的方式,但现在我正在尝试在MATLAB中执行此操作。

dips = numpy.where((smoothEnvelop[180:-180] < 7))[0] + 180 #7 is a threshold example

以下是使用循环的解决方案。它还包含定义步长的可能性。

% Input.
x = round(rand(20, 1) * 100)
% Window size.
ws = 5;
% Step size.
ss = 1;
% Number of elements.
nx = numel(x);
% Number of result elements.
ny = numel(1:ss:(nx - ws + 1));
% Initialize output.
y = zeros(ny, 1);
% Calculate output.
jj = 1;
for ii = 1:ss:(nx - ws + 1)
  ww = x(ii:(ii + ws - 1));
  [~, yLoop(jj)] = min(ww);
  yLoop(jj) = yLoop(jj) + ii - 1;
  jj = jj + 1;
end
% Output.
y

存储在y中的最小值的索引相对于原始输入x

ws = 5ss = 1的输出:

x =
   88
   74
   96
   31
    6
   67
   98
   92
   69
   49
   12
   28
   43
   87
   68
   49
   20
   98
   83
   62
y =
    5
    5
    5
    5
    5
   10
   11
   11
   11
   11
   11
   12
   17
   17
   17
   17

编辑

我使用索引添加了一个版本,这对于大型输入来说要快得多。

% Input.
x = round(rand(20000, 1) * 100);
% Window size.
ws = 5;
% Step size.
ss = 1;
% Number of elements.
nx = numel(x);
% --- Solution using loop --- %
% Number of result elements.
ny = numel(1:ss:(nx - ws + 1));
% Initialize output (loop).
yLoop = zeros(ny, 1);
tic
% Calculate output.
jj = 1;
for ii = 1:ss:(nx - ws + 1)
  ww = x(ii:(ii + ws - 1));
  [~, yLoop(jj)] = min(ww);
  yLoop(jj) = yLoop(jj) + ii - 1;
  jj = jj + 1;
end
tLoop = toc;
% Output (loop).
yLoop;
% --- Solution using indexing --- %
tic
% Calculate indices.
ind = 1:ss:(nx - ws + 1);
ind = repmat(ind, ws, 1) + ([0:(ws - 1)].' * ones(1, numel(ind)));
% Calculate output (indexing).
[~, yIndexing] = min(x(ind));
yIndexing = (yIndexing + (0:ss:(ss * (size(ind, 2) - 1)))).';
tIndexing = toc;
% Compare loop and indexing version.
fprintf("yLoop == yIndexing: %dn", sum(yLoop == yIndexing) == ny);
fprintf("yLoop time: %f sn", tLoop);
fprintf("yIndeing time: %f sn", tIndexing);

对于n = 20000ws = 5ss = 1,我们得到以下时间:

yLoop time: 0.672510 s
yIndeing time: 0.004466 s

Let

data = [6 7 7 3 6 1 3 7 2 1 0 8]; % example data
N = 4; % block size

对于不相交块,只需重塑介绍矩阵,使每个块成为一列,然后计算每列的参数最小值:

[~, indices] = min(reshape(data,N,[]), [], 1);

indices =
     4     2     3

对于滑动块,创建一个索引矩阵,然后沿每列计算参数最小值:

[~, indices] = min(data(bsxfun(@plus, 1:numel(data)-N+1, (0:N-1).')), [], 1);

indices =
     4     3     4     3     2     1     4     4     3

相关内容

  • 没有找到相关文章

最新更新