【发布时间】:2014-03-15 09:02:06
【问题描述】:
给定一个 nxn 矩阵 A(它实际上是图的邻接矩阵),我需要查看该矩阵的所有可能的 mxm 子矩阵(在本例中为 m =8),并将子矩阵传递给函数并收集其结果。
现在,我这样做如下:
# generate all possible 8x8 submatrices
for w in itertools.combinations(range(n), m):
# extract 8x8 submatrix from the matrix
submatrix = A[np.ix_(list(w),list(w))]
# do some work on the submatrix
foo(submatrix)
问题是:上面的代码在 n=30x30 矩阵中运行良好(大约有 500 万个可能的 m=8x8 子矩阵需要搜索)。但是,我想将我的算法应用于最多 n=100x100 的矩阵,这意味着(100 选择 8)= 1860 亿个可能的子矩阵。
有什么可以让我更快地完成这个过程的吗?或者它是难以解决的难题?
【问题讨论】:
-
对于“更快地执行此过程”,您是否希望将其矢量化,或者您是否正在寻找避免查看 1860 亿个窗口的解决方案?如果您需要第二件事,我们将需要更多详细信息。
-
仔细想想,这听起来不像是 MxM 窗口。一个窗口通常不是连续的吗?
-
您似乎正在尝试分析图形的所有大小为 8 的子图。在这种情况下,您不能使用连续窗口。根据您的任务,您也许可以应用图论来减少要完成的工作量,或者只是租用更多的计算机。
-
是的,这非常困难。 foo 计算什么,你真正想知道你的图表什么?思考这个问题可能会对您有所帮助,但即便如此,您也很有可能遇到麻烦。图论中的许多图问题都非常困难。
-
你需要认真问问自己是否总是需要全部 8 个 - 使用动态规划你可能能够重用 n 的第一个 m 的结果;这将大大加快整体处理速度。在这种情况下,您需要更聪明地工作,而不是更努力地工作 - 否则您将一事无成。
标签: python performance algorithm numpy matrix