Matlab在排序向量中搜索插入点

时间:2013-10-25 03:18:36

标签: matlab octave binary-search

如何搜索有序矢量中的插入点?

换句话说,什么是Matlab相当于Octave" lookup"功能: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);

然后,我想将计数数组分成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数组。

4 个答案:

答案 0 :(得分:0)

八度:

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

   3   7

Matlab的:

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

ans =

     3     7

答案 1 :(得分:0)

我认为这正是你要找的东西

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

如果您考虑向量x和值y,则需要在点y之后插入pos

答案 2 :(得分:0)

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

(有关interp1参数的要求,请参阅interp1qtable的帮助。)
可以类似地获得进一步的lookup功能。

答案 3 :(得分:0)

histc的第二个输出应该是您正在寻找的内容。 它是一个完整的内置,所以它也非常快。

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

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

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