問題陳述:讓S
爲一組整數,例如, S = {1,2,...,12}
。 M
是一個整數矩陣,其行可以被視爲S
的子集,其長度分爲S
元素的數量,特別是每行M
只包含不同的元素/整數。我試圖生成Matlab代碼,它可以識別所有不相交的行集合M
,它們的集合聯合給出S
(即具有固定大小的子集中的S
的分區),並將每個這樣的組作爲矩陣返回。在矩陣中查找k個不相交的行的組
實施例:A = [1 2 5 6; 3 4 11 12; 9 10 7 8]
是S
一個分區,而B = [1 2 3 4; 5 6 7 8; 9 10 11 12; 1 5 9 12]
不是S
一個分區(由於最後一行不與先前的3不相交)。
數量級:通常,M
將有〜500000行,並且S
將有多達100個元素。
方法至今:讓m = size(M,1)
,n = size(M,2)
(分區子集的大小),s = |S|
(下集的大小來劃分)和k = s/n
(必要不相交的行數,形成分區 - 你可以假設s = 0 mod n
,所以問題是明確的)。請注意,爲了建立這樣一個分區,只需檢查行的不相交情況,並且確切地說有很多這樣的分組。
對於j = 1:(m-k+1)
,我觀察到ind = (sum(ismember(M((j+1):m,:),M(j,:)),2)==0)
,它給出了M(j,:)
之後的行的索引列,這些索引列也與它不相交。然後,我通過將M(j,:)
與這些行中的每一行組合來創建2 x n
矩陣。之後,我想重複所有這些新的2 x n
矩陣的ismember()
例程,並不斷重複,直到得到k x n
矩陣。這可能都很好,並且很花哨,但它也是我偶然發現的地方,因爲其中一個for
例程的數量取決於k
。
問題:
(Q1)我怎樣才能完成我的方法的代碼? (Q2)是否有更好的方法來解決這個問題(即更快,矢量化/更少for
循環,GPU輔助),如果是,它們是什麼?
是否有'M'的典型列數。即'n'? 'S'總會有獨特的整數集合嗎? – Divakar 2014-08-27 19:35:36
如果我沒有弄錯,'n'不應該超過8或9。對於'S',可以假設'S =唯一的(M)',即'S'的所有元素都已經包含在'M'的某處。 「S」的所有元素都是不同的,它們的順序並不重要。我希望我能正確理解你的第二個問題。 – July 2014-08-27 19:58:47
@July:在你的大多數問題中,'M'是你輸入矩陣的名字,但在例子中'M'是一個可能的解決方案,請在那裏重新命名。至少我們知道解決方案的大小是'numel(S)',這允許嘗試近似值並在達到此大小時停止。你能提供一個示例數據集嗎? – Daniel 2014-08-27 20:03:16