映射2矢量 - 帮助矢量化
在Matlab中工作我有2个不同长度的x坐标向量。例如:映射2矢量 - 帮助矢量化
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。所以如果我有与这些坐标相关的值,我可以使用此地图作为索引并关联这些值。
这两个向量都是排序的,每个向量都没有重复。
我写了一个简单的函数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
对于上面的例子是回报
xmap =
1 2 2 3 3 3 8 9 10
它的工作原理确定,但需要一段时间有长向量(超过10点) 。
任何想法如何矢量化这段代码?
哦!另一种选择是:由于您正在寻找两个排序列表之间的密切对应关系,因此您可以使用类似合并的算法同时通过它们。这应该是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
编辑: 见@议员的评论,上面的代码是不完全正确的!
您的xm和xn排序。如果这通常是这种情况,那么你可以做得比跨越整个阵列好得多。
对于xn中的每个值,都会有一个xm值比其他值更接近该值的值的范围。事先计算这些时间间隔,然后可以按顺序逐步通过两个阵列。
趁着进行排序,正如大卫说,会更快,因为你有这么多点,但参考矢量化一个方法是使用meshgrid:
[X Y] = meshgrid(xn, xm);
diffs = X - y;
mins = min(diffs, [], 2);
注意,这将创造内存中有两个100,000 x 100,000阵列,所以它可能只适用于较小的数据集。
嗯,它需要大量的内存,然后比我的小矢量函数慢得多。 – yuk 2010-01-28 18:35:26
考虑这个矢量化的解决方案:
[~, xmap] = min(abs(bsxfun(@minus, xm, xn')))
漂亮的矢量化。谢谢。但是,它比我的函数慢两倍左右,而且需要更多的内存,但是比以前的代码更好。 – yuk 2010-01-28 18:37:22
我在Matlab的最新版本中使用新的〜语法来跳过一个未使用的变量。如果你有一个更早的版本,只需用〜替换tmp即可。 – yuk 2010-01-26 21:39:05
只是为了澄清,你想为每个xm [i]索引j这样xm [i]最接近xn [j]? – 2010-01-26 21:47:45
是的。很好的总结,谢谢。 – yuk 2010-01-27 01:20:20