在Matlab中工作,我有2个具有不同长度的x坐标向量。例如:
xm = [15 20 24 25 26 35 81 84 93];
xn = [14 22 26 51 55 59 70 75 89 96];
我需要将xm映射到xn,换句话说,要找到xn中最接近xm的坐标。因此,如果我有与这些坐标关联的值,则可以将此 map 用作索引并关联这些值。
两个向量都已排序,每个向量中没有重复项。
我用for循环编写了一个简单的函数:
function xmap = vectors_map(xm,xn)
xmap = zeros(size(xm));
for k=1:numel(xm)
[~, ind] = min(abs(xm(k)-xn));
xmap(k) = ind(1);
end
对于上面的示例是return
xmap =
1 2 2 3 3 3 8 9 10
它可以正常工作,但需要较长的向量(超过100,000点)。
有什么想法可以向量化此代码吗?
最佳答案
哦!另一种选择:由于您要查找两个排序的列表之间的紧密对应关系,因此可以使用类似合并的算法同时遍历两个列表。这应该是O(max(length(xm),length(xn)))-ish。
match_for_xn = zeros(length(xn), 1);
last_M = 1;
for N = 1:length(xn)
% search through M until we find a match.
for M = last_M:length(xm)
dist_to_curr = abs(xm(M) - xn(N));
dist_to_next = abs(xm(M+1) - xn(N));
if dist_to_next > dist_to_curr
match_for_xn(N) = M;
last_M = M;
break
else
continue
end
end % M
end % N
编辑:
参见@yuk的评论,以上代码并不完全正确!
关于performance - 映射2个向量-帮助向量化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2142826/