4

我想构造一个满足以下约束的二进制(0s和1s)矩阵:

  1. 每列必须仅包含单个二进制 1,该列的其余元素为 0。

  2. 矩阵的每一行之和应该是一个期望值。例如,给定一个rowSum向量 [5 7 6 8 .......],那么第一行的总和应该是 5,第二行的总和应该是 7,依此类推。

  3. nCol==Sum(rowSum)

此外,我想考虑几个(例如,7 个)满足相同条件的矩阵。

编辑:
我试图编写代码并完成了其中的一部分。代码是:

x=rand(21,50,7);
for k=1:7
    cons=max(x(:,:,7));
    for i=1:50
        for j=1:21
            if x(j,i,k)==cons(i)
                x(j,i,k)=1;
            else
                x(j,i,k)=0;
            end
        end
     end
 end
 x
4

1 回答 1

6

构建满足您要求的二进制矩阵并不总是可能的。假设您想要一个大小为nRowsx的二进制矩阵,nCols其中rowSum(长度为 的向量nRowsrowSum(k)1第 sk行中的数量。所以,如果nCol ~= sum( rowSum )不可能构造这样的矩阵:你要么有没有1s 的列,要么有太多1s 的列......

因此,您的二进制矩阵是完全定义的rowSum- 直到其列的随机排列。

这个函数如何构造基本矩阵b

function b = makeBizarreBinaryMatrix( rowSum )

nRows = numel( rowSum );
nCols = sum( rowSum );   
rows = 1:nRows;
rowInd = zeros( 1, nCols );
rowInd( cumsum( [1 rowSum(1:end-1)] ) ) = 1;
rowInd = rows( cumsum( rowInd ) );
b = sparse( rowInd, 1:nCols, 1, nRows, nCols );

现在您可以使用randperm随机排列列的顺序:

nb = b(:, randperm(size(b,2)) );

祝你的论文好运。

于 2013-01-17T13:50:33.780 回答