【发布时间】:2014-08-27 19:05:05
【问题描述】:
问题说明:让S 是一组整数,例如S = {1,2,...,12}。 M 是一个整数矩阵,其行可以被视为S 的子集,其长度除以S 的元素数量,特别是M 的每一行仅包含不同的元素/整数。我正在尝试生成Matlab代码,该代码可以识别M的所有不相交行组,其集合理论联合给出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 矩阵。之后,我想用所有这些新的2 x n 矩阵重复ismember()routine,并继续重复直到我得到k x nmatrices。这可能一切都很好而且很花哨,但这也是我绊倒的地方,因为一方面,for-routines 的数量取决于k。
问题:
(Q1) 如何完成我的方法的代码?
(Q2)是否有更好的方法来解决这个问题(即更快、矢量化/更少for 循环、GPU 辅助),如果有,它们是什么?
【问题讨论】:
-
M是否有典型的列数。即n?S总是有唯一的整数集吗? -
n不应该超过 8 或 9,如果我没记错的话。对于S,可以假设S = unique(M),即S的所有元素都已经包含在M的某处。S的所有元素都是不同的,它们的顺序无关紧要。希望我正确理解了您的第二个问题。 -
@July:在您的大部分问题中,
M是您输入矩阵的名称,但在示例中,M是一种可能的解决方案,请在此处重命名。至少我们知道您的解决方案的大小是numel(S),这允许尝试近似值并在达到此大小时停止。你能提供一个示例数据集吗? -
@Daniel:哎呀,抱歉,已修复。当然,我可以提供一个数据集,如果你告诉我在哪里上传它以及你希望它有多大。
-
对于第二季度——我建议你不要优化,首先让一些方法起作用。 “过早的优化是万恶之源”。
标签: algorithm matlab matrix combinatorics