如何从sums构建二进制矩阵

时间:2015-01-13 19:41:48

标签: arrays math matrix sum branch-and-bound

我有两个十进制数变量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列的错误总和值,使用数据透视表I在同一行中互换它们(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步

使用与每行中的R0(i)一样多的1来创建和填充NxN数组:

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 第一列总和符合调用替换的条件,所以

第3步

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

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

|C0(i)-C1(i)| 
对于这个例子,

,| C0(0)-C1(0)| = 1改变。 如果更改在列总数之间产生更大的差异,则必须返回条件。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

  • 取2 2n 位数据
  • 将其视为2 n ×2 n
  • 要描述数据,请使用2×2 n 行和列总和,每个使用最多log 2 (2 n )= n位
  • 将数据压缩为2×n×2 n

因为2×n×2 n << 2 2n 并且这个过程可以继续重复,假设你可以唯一地表示任何m×m位的矩阵,只有它的行和列总和是假的。