【问题标题】:Matlab search for insertion points in sorted vectorMatlab搜索排序向量中的插入点
【发布时间】:2013-10-25 03:18:36
【问题描述】:

如何在已排序的向量中搜索插入点?

换句话说,八度“查找”函数的 Matlab 等价物是什么:http://www.gnu.org/software/octave/doc/interpreter/Finding-Elements-and-Checking-Conditions.html#doc%2dlookup

进一步说明:

这是我想做的:

res = bsxfun(@gt, A * B, c);

其中 A 和 B 是大型稀疏矩阵,c 是非负列向量。

不幸的是,在与 c 比较之前,矩阵 A * B 有太多非零元素无法放入内存,所以我不能直接做这个乘法。

相反,我通过取来为每行中非零元素的数量设置一个上限

counts = spones(A) * sum(spones(B),2);

然后,我想将 counts 数组拆分为 n 个总和大致相等的部分。在 Octave 中我会说:

cs = cumsum(counts)';
sectionSize = ceil(cs(end) / n);
places = lookup(cs, (0:n) * sectionSize);
bounds = [places(1:n) + 1; places(2:(n+1))];

现在我可以一块一块地构建 res 而不会耗尽机器上的所有内存:

res = sparse(size(A,1),size(B,2));
for b = bounds
    res(b(1):b(2),:) = bsxfun(@gt,A(b(1):b(2),:) * B,c(b(1):b(2)));
end

我欢迎任何关于如何做到这一点的更好的想法。特别是因为 Matlab 警告说不应该以这种方式通过索引来构建 res 数组。

【问题讨论】:

  • 你能举一个 Octave lookup 函数的例子吗?

标签: matlab octave binary-search


【解决方案1】:

八度:

octave:6> lookup([1:10], [3 7])
ans =

   3   7

Matlab:

>> find(ismember([1:10], [3 7]))

ans =

     3     7

【讨论】:

  • 这仅在元素在表格中时有效。我想找到插入点(即元素在表格中的位置?)
  • @dspyz 我明白了。你能举例说明你做了什么吗?我误会了。
【解决方案2】:

我认为这正是您要寻找的东西

 x = primes(10)
 y = 4;
 pos = find(x>y,1)-1

如果您考虑向量x 和值y,您可能希望在点pos 之后插入y

【讨论】:

    【解决方案3】:

    histc 的第二个输出应该是您要查找的内容。 它是一个完整的内置程序,所以速度也很快。

    类似于八度音程lookup,您可以将其用作:

    [~, idx] = histc(y, table)
    

    其中table 是插入y 中的值的排序向量。

    【讨论】:

      【解决方案4】:

      对于基本
      lookup(table,y)
      功能
      floor(interp1(table,val,y))
      甚至更好
      floor(interp1q(table,val,y))
      可以使用,其中
      val = (1:length(table))'

      (有关table 参数的要求,请参阅interp1interp1q 的帮助。)
      可以类似地获得更多lookup 功能。

      【讨论】:

        猜你喜欢
        • 2013-04-23
        • 2017-03-28
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多