2013-10-25 29 views
1

如何在已排序向量中搜索插入點?Matlab在已排序向量中搜索插入點

換句話說,有什麼Matlab的等效Octave的 「查找」 功能: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個部分,其總和大致相等。在八度,我會說:

cs = cumsum(counts)'; 
sectionSize = ceil(cs(end)/n); 
places = lookup(cs, (0:n) * sectionSize); 
bounds = [places(1:n) + 1; places(2:(n+1))]; 

現在我可以建立一塊一塊資源耗盡沒有在機器上的所有內存:

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

你可以舉一個Octave'lookup'函數的例子嗎? – chappjc

回答

0

八度:

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

    3 7 

Matlab的:

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

ans = 

    3  7 
+0

這隻適用於元素在表格中。我想找到插入點(即元素在表格中的位置?) – dspyz

+0

@dspyz我看到了。你能舉個例子嗎?我誤解了。 – Marcin

0

我認爲這僅僅是你在找什麼

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

如果考慮向量x和價值y,你會想要在點之後插入

0

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

(參見interp1 RESP。interp1q幫助上table參數的要求。)
此外lookup功能可以類似地獲得。

0

histc的第二個輸出應該是你要找的。 這是一個完整的內置,所以它也很快。

與八度lookup比喻,你可以使用它作爲:

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

tabley值被插入其中的排序向量。