【发布时间】: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