如何在 MATLAB 中找到距离范围最近的矩阵元素值?
How can I find the nearest matrix element value to a range in 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
最接近范围 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 is available starting from MATLAB R2021b. For older versions here is a way with dsearchn
的'ComparisonMethod'
选项:
[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]);
最靠近范围中心的值始终是您要查找的值。我建议你在纸上尝试几个例子来说服自己。
范围 [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)
.
获取值
我有一个 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
最接近范围 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 is available starting from MATLAB R2021b. For older versions here is a way with dsearchn
的'ComparisonMethod'
选项:
[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]);
最靠近范围中心的值始终是您要查找的值。我建议你在纸上尝试几个例子来说服自己。
范围 [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)
.