我有两个数组,der_pos
和 der_neg
,其中包含数组插值
的索引。我想获取间隔中插值
最大值的所有索引:
der_pos(1):der_neg(1)
der_pos(2):der_neg(2)
etc...
例如:
interpolated = [1,5,3,2,7,10,8,14,4]
der_pos = [1,6]
der_neg = [4,9]
所以,我想获取索引:
[2,8]
因为:
在区间
der_pos(1):der_neg(1)
→1:4
→interpolated(1:4) = [1, 5,3,2]
最大值为5
,位于索引2
处。在区间
der_pos(2):der_neg(2)
→6:9
→interpolated(6:9) = [10, 8,14,4]
最大值为14
,位于索引8
处。
我设法使用 for
循环来做到这一点:
interpolated = [1,5,3,2,7,10,8,14,4];
der_pos = [1,6];
der_neg = [4,9];
indices = zeros(1,length(der_pos));
for i = [1:length(der_pos)]
[peak, index] = max(interpolated(der_pos(i):der_neg(i)));
indices(i) = index + der_pos(i) - 1;
endfor
indices % gives [2,8]
但是有没有更简洁的方法来做到这一点?
最佳答案
这是一个示例代码。函数 findpeaks
返回所有峰值。然后,循环保留所需范围内的峰值索引。
我添加了一个测试,以避免在未找到峰值的情况下出现错误(索引将为-1),并在找到两个峰值时保留第一个峰值。如果您想将所有峰值保留在一个区间内,您可以使用单元格
。
interpolated = [1,5,3,2,7,10,8,14,4];
der_pos = [1 6 7 ];
der_neg = [4 9 8];
[~,i]=findpeaks(interpolated);
indices= -1+zeros(size(der_pos,2),1);
for loopi = 1:length(i)
val = i(i>=der_pos(loopi)&i<=der_neg(loopi));
if ~isempty(val)
indices(loopi) = val(1);
end
end
关于matlab - 如何找到多个区间内的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47448262/