在MATLAB I中工作,有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。因此,如果我具有与这些坐标相关的值,则可以将此映射用作索引并将这些值关联。

两个向量都是分类的,每个向量中都没有重复。

我用for-loop写了一个简单的功能:

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

它可以正常工作,但是需要长时间的矢量(超过100,000点)。

有什么想法如何矢量化此代码?

有帮助吗?

解决方案

哦!另一个选项:由于您正在寻找两个排序列表之间的密切对应关系,因此可以使用类似于合并的算法同时浏览它们。这应该是o(最大(长度(xm),长度(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的评论,以上代码并不完全正确!

其他提示

考虑此矢量化解决方案:

[~, xmap] = min( abs(bsxfun(@minus, xm, xn')) )

我知道解决这个问题的最快实施是 这个 (C代码可以作为.mex文件编译;对我来说,它比被接受的答案中的Reckdsk代码快20倍)。令人惊讶的是,这种常见的操作不是MATLAB内置功能。

看起来您的输入向量已分类。使用二进制搜索查找最接近的匹配。这将为您提供O(n Ln n)运行时间。

您的XM和XN已分类。如果通常是这种情况,那么您可以做得比踏上整个阵列要好得多。

对于XN中的每个值,将有一系列值XM中的值比其他任何数字更接近该数字。事先计算这些间隔,然后您可以顺序逐步介绍两个阵列。

实际解决方案:此列表是Workspace中的隐藏列表,其中包含权限锁定。崩溃了我的SPD多次并损坏了我的测试会议工作区,因为我试图乱七八糟。这里是通过Visual Studio 的一个解决方案。

您可能会更容易将jQuery和一些JavaScript添加到您的页面上,并只是隐藏有问题的会议实例。

原始,文本不正确:您需要进入日历,看看第15次会议是否有两次会议,并删除其中一个。如果这是一个经常性会议,那么您可能只有1个工作空间。如果是这种情况,请不要删除工作区,只有日历项目!验证所有网站内容并查看列出的工作空间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top