如何在Matlab中找到离指定索引最近的索引

7

我在MATLAB中有两个向量A和B。B包含一些索引(从1到末尾)。我有一个随机索引R(在向量索引范围内)。我想编写一个函数(或语句)来选择A [z],其中z是最接近R但不包含在B中的数字(即索引)。

示例:

A = [2 3 6 1 9 7 4 5 8]
B = [3 4 5 6 7 8]
R = 5

该函数必须返回3,因为最近的索引是2,因为5-2<9-5,并且2不在B中,所以A[2] = 3。
谢谢。
3个回答

6
改进Jacob的答案,这里是正确的解决方案:
[result, z] = min(abs(R - setxor(B, 1:numel(A))))

在您的情况下,这将产生z = 2result = A(2) = 3


1
谢谢您的帮助。我认为使用settdiff比使用setxor更好。我已经按照下面的更改了您的代码,请告诉我您的意见。 - remo
我正在使用MATLAB 2012。根据setxor文档,setxor(A,B) = A-B union B-A(对称差)。然而,在我们的情况下,我认为它不会产生任何差异,因为B包含在范围内的数字。 - remo

2

如果我理解正确,您可以先进行排除操作,找到不在B中的索引,即excl = A(setxor(B,1:length(A)))。然后很容易像这样得到最小值excl(min(abs(R-excl)))


"setxor" 明显是正确的方向,但是结果是错误的。 "excl" 应该包含 "A" 的下标,而不是其值。 - Eitan T

0
请注意,setdiff和setxor函数会对结果进行排序。
tmpSet = R - setdiff(1:numel(A),B);
[~,z] = min(abs(tmpSet));
z = tmpSet(z);
Result = A(R-z);

问题中相同的示例:

A = [2 3 6 1 9 7 4 5 8]
B = [3 4 5 6 7 8]
R = 5

tmpSet = 5 - {1 2 9} = {4 3 -4}
z = 2
z = 3
Result = A(5-3) = A(2) = 3 

感谢你的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接