2

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

换句话说,八度“查找”功能的 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 数组不应该以这种方式通过索引来构建。

4

4 回答 4

0

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

与 octaves 类比lookup,您可以将其用作:

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

table插入值的排序向量在哪里y

于 2014-06-02T09:46:57.313 回答
0

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

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

于 2014-06-02T09:34:31.637 回答
0

我认为这正是您正在寻找的

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

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

于 2013-10-25T13:03:47.910 回答
0

八度:

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

   3   7

MATLAB:

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

ans =

     3     7
于 2013-10-25T05:01:10.520 回答