如何在MATLAB中找到最接近某个范围的矩阵元素值



我有一个3D矩阵,我需要找到最接近[0到1]范围的值。例如,我有[-2.3-1.87-0.021 1.1 1.54],应该选择-0.021,因为它是最接近该范围的值。

已编辑:该范围内将有零个或一个值。如果有,应该返回,如果没有,应该返回最近的值

编辑:这是我试图正确工作的代码部分:

rt = zeros(size(audio_soundIntervals, 1), size(prtcpnt.audioAttention_ToM.sound_eventTime, 1), size(prtcpnt.audioAttention_ToM.sound_eventTime, 2));
for r = 1:size(prtcpnt.audioAttention_ToM.sound_eventTime, 1)
for t = 1:size(prtcpnt.audioAttention_ToM.sound_eventTime, 2)
for b = 1:size(audio_soundIntervals, 1)
% here, I want to find the nearest element of audio_eventReshape(:, r, t) to the range [audio_soundIntervals(b, r, t), audio_soundIntervals(b, r, t) + 1]
end
end
end

距离范围中心最近的值始终是您要查找的值。我建议你试着在纸上举几个例子来说服自己。

范围[a,b]的中心是(b-a(/2。在你的情况下,这是0.5。

因此,找到abs(A-0.5)的最小值将给出您的答案。如果A是一个矩阵,那么A(:)是一个可以应用运算的向量

[~,indx] = min(abs(A(:)-0.5));

或者更一般地说:

[~,indx] = min(abs(A(:)-(b-a)/2));

indx是您要查找的元素的A的线性索引,使用A(indx)获取值。

您可以使用此函数查找A与范围range:最接近的值

function out = near_range(A, range)
[m1, idx1] = min(A - range(1), [], 'all', 'ComparisonMethod', 'abs');
if abs(m1) >= diff(range)
out = A(idx1);
return
end
[m2, idx2] = min(A - range(2), [], 'all', 'ComparisonMethod', 'abs');
if abs(m1) < abs(m2)
out = A(idx1);
else
out = A(idx2);
end
end

用法:

result =  near_range([-2.3 -1.87 -0.021 1.1 1.54], [0 1]);

编辑:

函数min的'ComparisonMethod'选项可从MATLAB R2021b开始使用。对于旧版本,这里有一种使用dsearchn:的方法

[k, dst] = dsearchn(A(:), range(:));
result = A(k(1 + (diff(dst) < 0)));

第2版:

我将第二种方法打包为一个函数:

function out = near_range(A, range)
[k, dst] = dsearchn(A(:), range(:));
out = A(k(1 + (diff(dst) < 0)));
end

用法:

rt(b, r, t) = near_range(audio_eventReshape(:, r, t), [audio_soundIntervals(b, r, t), audio_soundIntervals(b, r, t) + 1]);

相关内容

  • 没有找到相关文章

最新更新