问题陈述:设S为整数的集合,例如 S = {1,2,...,12}。M是一个整数矩阵,其行可以视为S的子集,其长度除以S的元素数量,特别地,M的每一行仅包含不同的元素/整数。我试图编写Matlab代码,可以识别所有不相交行组成的组,其集合论并给出S(即具有固定大小的子集的S的分区),并将每个这样的组作为矩阵返回。
例子: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将具有约500,000行,S将具有多达100个元素。
迄今为止的方法:让m = size(M,1), n = size(M,2)(分区子集的大小),s = |S|(要分区的集合的大小)和k = s/n(必须不相交的行数以形成分区 - 您可以假设s = 0 mod n,因此问题是明确定义的)。请注意,为了建立这样的分区,仅需检查行的不相交性以及确切地有k个这样的行。
对于j = 1:(m-k+1),我观察ind = (sum(ismember(M((j+1):m,:),M(j,:)),2)==0),它给出了与它不相交的M(j,:)之后的行的索引列。然后,通过将M(j,:)与每个这些行组合来创建2 x n矩阵。之后,我想重复ismember()例程,并使用所有这些新的2 x n矩阵重复,直到获得k x n矩阵。这可能很好,但这也是我跌倒的地方,因为首先for-routines的数量取决于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将具有约500,000行,S将具有多达100个元素。
迄今为止的方法:让m = size(M,1), n = size(M,2)(分区子集的大小),s = |S|(要分区的集合的大小)和k = s/n(必须不相交的行数以形成分区 - 您可以假设s = 0 mod n,因此问题是明确定义的)。请注意,为了建立这样的分区,仅需检查行的不相交性以及确切地有k个这样的行。
对于j = 1:(m-k+1),我观察ind = (sum(ismember(M((j+1):m,:),M(j,:)),2)==0),它给出了与它不相交的M(j,:)之后的行的索引列。然后,通过将M(j,:)与每个这些行组合来创建2 x n矩阵。之后,我想重复ismember()例程,并使用所有这些新的2 x n矩阵重复,直到获得k x n矩阵。这可能很好,但这也是我跌倒的地方,因为首先for-routines的数量取决于k。
问题:如何完成我的方法的代码?
(Q2) 是否有更好的解决此问题的方法(例如更快,矢量化/少用for
循环,GPU辅助等),如果有,它们是什么?
M
通常有多少列,例如n
?S
是否总是具有唯一的整数集合? - Divakarn
不应超过8或9。对于S
,可以假设S = unique(M)
,即S
中的所有元素已经在M
中存在。S
中的所有元素都是不同的,它们的顺序并不重要。希望我对你的第二个问题理解正确。 - M.G.nchoosek(m,s)
行组合,这是_很多_。对于m = 5e5
和s = 3
,大约有2e16
个组合。即使每个组合只有1e-6秒的时间,也需要大约600年。 - Luis Mendo