Fin*_*ind 1 arrays mapping indexing matlab
我需要获取数组中某个值的索引(即位置),并且我想知道是否存在比使用find命令更快的方法,方法是构造某种包含数组之间映射关系的映射或查找表值和索引。
以这个数组为例:
th = [0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90];
Run Code Online (Sandbox Code Playgroud)
现在,假设我有一个变量,其值为
angle = 55
Run Code Online (Sandbox Code Playgroud)
并且我想知道此值在数组中的位置(正确答案是idx = 12)。现在,我当然可以使用find:
idx = find(th==angle)
Run Code Online (Sandbox Code Playgroud)
但是我的问题是,在我的代码中,我需要进行此查找,以获取数(百万)次中th的值的索引angle,而不断调用该find函数似乎浪费资源,我想它正在循环th并进行某种比较。
相反,我希望有某种方法可以建立一对一的映射或查找表,在这里我可以立即获取对应于我拥有的值的索引angle。(注意:我知道我拥有的值angle将始终与中的值之一完全对应th。)因此,只需具有一些功能
idx = angle2i(angle)
Run Code Online (Sandbox Code Playgroud)
执行此映射:
0 -> 1
5 -> 2
10 -> 3
15 -> 4
20 -> 5
25 -> 6
Run Code Online (Sandbox Code Playgroud)
等等
但是我没有看到如何实现这样的查找(嗯,我有两个非常不优雅的想法,我希望并猜想对此必须有一些聪明的方法)。还是我在这里浪费时间,我应该只使用find命令吗?
您正在寻找containers.Map。
您可以这样做:
th = [0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90];
angle2i = containers.Map(th,1:numel(th));
index = angle2i(55)
Run Code Online (Sandbox Code Playgroud)
这是一个通用解决方案,只需要th包含唯一元素即可。它们不需要排序,也不需要是整数(尽管在比较浮点值时必须小心!)。该解决方案应该比find大型阵列快得多,因为该解决方案为O(log n),而find解决方案为O(n)。但是对于非常小的阵列,containers.Map将显示使用的开销。
如果th可以保证排序,那么其他问题的解决方案也可能会有用。
当然,如果存在简单的数学关系(如该示例的情况)th,则不能击败@mattesyo的O(1)解决方案来计算索引。