Algorithm 如何获得';n';两个向量的可能矩阵?

Algorithm 如何获得';n';两个向量的可能矩阵?,algorithm,Algorithm,我一直在寻找一种算法,用于求解所有可能的维数为“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

我一直在寻找一种算法,用于求解所有可能的维数为“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]

行的总和为:

行=[43243]

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


我希望能有助于解决这个问题的想法。

一个明显的方法是强制执行一个解决方案:对于第一行,生成所有具有正确总和的可能性,然后对于每一行,生成第二行的所有可能性,依此类推。生成所有行后,检查列的总和是否正确。但这需要很多时间。一天中的这个时候,我的数学可能已经过时了,但我相信一行长度
n
k
位为1的不同可能性的数量是由Matlab中的or给出的。要确定可能性的总数,必须将每一行的数字相乘:

>> 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小时之间产生差异


优化后的版本可能会生成行和列,并从可能性最低的行和列开始。我不知道是否有比暴力法更优雅的解决方案,我很想听听。

你能多说一点你想要的吗?例如,我将矩阵的第一行解释为二进制1101010==十进制106,而不是4。这更像是一个线性代数问题,而不是一个编程问题。它可能在Math.StAcExchange .COMSED代码中,你已经尝试过了。所以,你想用C++、C语言、MATLAB或者什么?出于好奇,应用是什么?某种类型的谜题?谢谢Bas Swinckels,我也在做同样的事情,我希望还知道其他更有效的方法那么你的代码足够快吗,还是要花很长时间?你用了我建议的额外技巧吗?如果您对答案感到满意,请向上投票或接受。@RaúlEmirGutiérrezLópez您说您也这么做了-为了将来的参考,您应该在您的问题开始时包括这一尝试。