如何搜索有序矢量中的插入点?
换句话说,什么是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数组。
答案 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
参数的要求,请参阅interp1q
和table
的帮助。)
可以类似地获得进一步的lookup
功能。
答案 3 :(得分:0)
histc
的第二个输出应该是您正在寻找的内容。
它是一个完整的内置,所以它也非常快。
与八度音程lookup
类似,您可以将其用作:
[~, idx] = histc(y, table)
其中table
是插入y
中的值的排序向量。