如何从总和构建二进制矩阵

How to build a binary matrix from sums

我有两个十进制数变量,colSum 和 rowSum,使用它们我想根据这些总和构建一个二进制值矩阵,rowSum 数组变量是将每一行的所有 1 相加的结果,相同用于 colSum 数组。

所以,如果你有

rowSum = [0,1,2]
colSum = [1,1,1]

您必须正确构建以下数组

matrix = [
 [0,0,0],
 [0,0,1],
 [1,1,0]
]

我在 PHP 中使用了这种方法,它适用于 3x3 矩阵,但不适用于更大的矩阵,例如 8x8。 首先,使用 rowSum 值填充行中的所有 1。 然后,尝试找到 2 列的错误总和值,使用一个主元我在同一行中交换它们(1 个具有 cero 值),直到我得到正确的 colSum 值。 但它不起作用,因为我需要对标准进行一些控制,以更改同一行中两列的 1 和 0...

这是我正在使用的方法。

假设我们有这个矩阵(N=3 -> NxN):

0  0  0
0  0  1
1  1  0

然后我们有以下数组

R0 = {0,1,2} //--> result of sums of each rows: ( 0+0+0, 0+0+1 , 1+1+0 )
C0 = {1,1,1} // ->sums of each columns

第 1 步

创建并填充一个 NxN 数组,每行使用与 R0(i) 一样多的 1:

0  0  0
1  0  0
1  1  0 

现在计算这个新矩阵的总和: R1 = {0,1,2} C1 = {2,1,0}

第 2 步

检查所创建矩阵的列和的所有元素是否具有与 C0(原点)相同的值

for ( i=0, N-1) do

 if C0(i)!=C1(i) then
   ReplaceColumn(i)
 end

end

要替换列,我们必须挖掘内部条件。 C0(0) = 1 != C1(0) = 2 第一列 sum 确实满足调用替换的条件,所以

第 3 步

选择应用分支定界法的标准并找到满足全局条件(所有列总和)的更改列的最佳行。

列总和之间差异的变化量是:

|C0(i)-C1(i)| 

对于这个例子,|C0(0)-C1(0)| = 1 次更改。 返回条件必须是如果更改在列的总和之间产生更大的差异。

Σi,N(|C0(i)-C1(i)|)

那么,这个方法真的有用吗?

目标是构造满足行列和的矩阵还是满足它们的a矩阵?从问题中不清楚,但如果是前者(“the”案例)那么这是不可能的。

假设您可以用这种方式唯一地表示任何 m × m 位矩阵。然后考虑下面假设的压缩算法。

  • 取22n位数据
  • 视为2n×2n
  • 为了描述数据,使用 2 × 2n 行和列总和,每个最多使用 log2(2n) = n 位
  • 数据压缩为2×n×2n

因为 2 × n × 2n << 22n 并且这个过程可以不断重复,假设你可以仅通过其行和列总和唯一地表示任何 m × m 位矩阵是错误的。