2017-03-01 31 views
0

我有形式的陣列的集合的有效方式,存儲和定位陣列在Matlab

a = [1 2 3 5 6 8 9 10] 
b = [1 2 3 4 7 14] 
c = [1 2 3 4 5 6 7 8 15 19 20] 

也就是說,每一個都是從1非重複數至M的集合(寫成M這個例子是20,但實際上可能會大得多)。一般來說,我會有很多這樣的數組(多於3個,但事先並不知道有多少,可能在5000-10000左右)有重複(也就是說,數組b可能會出現多次)。

目標:我想將數組存儲在某個對象中,稱之爲X,它跟蹤它包含的每個數組的多少個實例。此外,當面對一個新的數組時,我們應該能夠搜索X並增加對象中該數組的數量,或者如果它不在數組中,則將它添加到對象中(計數爲1)。

問題:什麼是在Matlab中實現目標的有效方法?


我試過到目前爲止:

我在想轉換陣列邏輯陣列,例如,

a = [1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0]; 

那麼也許將上述二進制編號a_bin並索引存儲編號的單元格數組X,即X {a_bin}存儲a出現的次數。雖然a_bin對於大數M可能會變得非常大,但這看起來很差。

+1

這聽起來像一個XY問題給我。爲什麼你會得到這麼多不同長度的數組,你需要一直保持記憶?我沒有看到優勢。 – Bernhard

+0

@伯恩哈德我不明白爲什麼這是一個問題。難道不應該說出他們所嘗試過的,而不僅僅是問一個問題嗎?另外,我不明白爲什麼我需要證明我爲什麼要嘗試做什麼的理由。 – jonem

+0

我的觀點在這個問題上表達得更好:http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem我並不是說這是你的情況,但它看起來很多喜歡它, – Bernhard

回答

1

使用單元格數組將它們保留在一個位置,並且如果這個新數組已經在主單元格數組中,只搜索(=與每個比較) 。無需複雜化。使用已存在於主單元陣列中的位置數組標記單元陣列的每個元素。並在新的重複,更新所有人。

無論如何,你估計內存使用? 20個元素/陣列* 10k陣列* 8B /元素= 2MB。這很小。

+0

謝謝,實際上M可能比20大得多。對於這種方法仍然可行的M的上限是多少? – jonem

+0

@jonem如果你達到內存限制,你將需要以不同的方式解決問題,從編寫數組的部分到磁盤,以思考如何以最好的方式壓縮整數。 但是,只要你有足夠的內存,這種方法應該是可行的。如果你有16GB,比如1k個元素/陣列* 1M陣列= 8GB仍然可以。 除非搜索成爲瓶頸。 –