【问题标题】:How I can get the 'n' possible matrices from two vectors?如何从两个向量中获得“n”个可能的矩阵?
【发布时间】:2013-10-13 21:06:10
【问题描述】:

我一直在寻找一种算法来解决所有可能的维度为“n”的矩阵,这可以通过两个数组获得,一个是行的总和,另一个是列的总和矩阵。例如,如果我有以下 7 维矩阵:

matriz= [ 1  0  0  1  1  1  0
          1  0  1  0  1  0  0
          0  0  1  0  1  0  0
          1  0  0  1  1  0  1
          0  1  1  0  1  0  1
          1  1  1  0  0  0  1
          0  0  1  0  1  0  1 ]

各列的总和是:

col= [4 2 5 2 6 1 4]

行的总和是:

行 = [4 3 2 4 4 4 3]

现在,我想获得所有可能的“一和零”矩阵,其中列和行的总和分别满足“col”和“row”的条件。

我会很感激可以帮助解决这个问题的想法。

【问题讨论】:

  • 你能多说一点你在找什么吗?例如,我将 Matriz 的第一行解释为二进制 1101010 == 十进制 106,而不是 4。
  • 这更像是一个线性代数问题,而不是一个编程问题。它可能应该在 math.stackexchange.com 上
  • 显示到目前为止您尝试过的示例代码。
  • 那么,你想用 C++、C#、Matlab 还是什么?
  • 出于好奇,应用程序是什么?某种类型的谜题?

标签: algorithm


【解决方案1】:

一种明显的方法是暴力破解解决方案:对于第一行,生成所有具有正确总和的可能性,然后为每一个可能性,生成第二行的所有可能性,依此类推。生成所有行后,检查列的总和是否正确。但这需要很多时间。我的数学在一天中的这个时候可能会生疏,但我相信n 其中k 位为1 的行的不同可能性的数量由Matlab 中的binomial coefficientnchoosek(n,k) 给出。要确定可能性的总数,您必须将每一行的这个数字相乘:

>> n = 7;
>> row= [4 3 2 4 4 4 3];
>> prod(arrayfun(@(k) nchoosek(n, k), row))
ans =
   3.8604e+10

这是检查的很多可能性!对列执行相同操作会得到

>> col= [4 2 5 2 6 1 4];
>> prod(arrayfun(@(k) nchoosek(n, k), col))
ans =
   555891525

仍然是一个很大的数字,但“只”小了 70 倍。

通过查看后面的行是否已经受到前面的行的约束,可以稍微改进这种蛮力方法。如果在您的示例中,对于前两行的特定组合,两行在第二列中都有 1,则该列的其余部分都应为 0,因为总和必须为 2。这减少了剩下的行有点。实施此类检查可能会使事情变得有些复杂,但它们可能会在需要 2 天的计算或仅需要 1 小时的计算之间产生差异。

此优化版本可能会交替生成行和列,并从可能性数量最少的那些开始。我不知道是否有比这种蛮力方法更优雅的解决方案,我很想听听。

【讨论】:

  • 谢谢 Bas Swinckels,我也是这样做的,希望还知道一些其他更有效的方法
  • 那么您的代码是否足够快,还是需要很长时间?你是否使用了我提出的额外技巧?如果您对答案感到满意,请点赞或接受。
  • @RaúlEmirGutiérrezLópez 你说你也在做同样的事情 - 为了将来参考,你应该在你的问题中包含这个尝试。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多