我是新手,我想知道有什么方法可以让我做到以下几点:
这就是我过去在Python语言中(使用numpy.where)做这件事的方式,但现在我正尝试在MatLab中做这件事。有什么需要帮忙的吗?
dips = numpy.where((smoothEnvelop[180:-180] < 7))[0] + 180 #7 is a threshold example
8yoxcaq71#
以下是使用循环的解决方案。它还增加了定义步长的可能性。
% 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 = 5和ss = 1的输出:
y
x
ws = 5
ss = 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: %d\n", sum(yLoop == yIndexing) == ny); fprintf("yLoop time: %f s\n", tLoop); fprintf("yIndeing time: %f s\n", tIndexing);
对于n = 20000、ws = 5和ss = 1,我们得到以下时间:
n = 20000
yLoop time: 0.672510 s yIndeing time: 0.004466 s
kjthegm62#
让我们
data = [6 7 7 3 6 1 3 7 2 1 0 8]; % example data N = 4; % block size
对于不相交的块,只需重塑一个矩阵,使每个块成为一列,然后计算每列的Arg min:
[~, indices] = min(reshape(data,N,[]), [], 1);
赠送
indices = 4 2 3
对于滑动块,创建索引矩阵,然后沿每列计算Arg min:
[~, indices] = min(data(bsxfun(@plus, 1:numel(data)-N+1, (0:N-1).')), [], 1);
indices = 4 3 4 3 2 1 4 4 3
2条答案
按热度按时间8yoxcaq71#
以下是使用循环的解决方案。它还增加了定义步长的可能性。
存储在
y
中的最小值的索引相对于原始输入x
。ws = 5
和ss = 1
的输出:编辑
我添加了一个使用索引的版本,这对于大输入来说要快得多。
对于
n = 20000
、ws = 5
和ss = 1
,我们得到以下时间:kjthegm62#
让我们
对于不相交的块,只需重塑一个矩阵,使每个块成为一列,然后计算每列的Arg min:
赠送
对于滑动块,创建索引矩阵,然后沿每列计算Arg min:
赠送