如何在已排序的向量中搜索插入点?
换句话说,八度“查找”功能的 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 数组不应该以这种方式通过索引来构建。