简体   繁体   中英

construct a binary matrix such that each column contains only single “1” and sum of each row is of desired value

I want to construct a binary(0s and 1s) matrix satisfying the following constraints:

  1. Each column must contains only single binary 1 and rest elements of that column are 0s.

  2. The sum of each ROW of matrix should be a desired value. For example, given a rowSum vector of [5 7 6 8 .......] then the sum of first row should be 5, sum of second row should be 7 and so on.

  3. nCol == Sum(rowSum)

Moreover, I would like to consider several (eg, 7) matrices satisfying the same conditions.

EDIT:
I have tried to write the code and completed the one part of it. The code is:

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

It would not always be possible to construct a binary matrix that satisfies your requirements. Suppose you want a binary matrix of size nRows x nCols with rowSum (a vector of length nRows ) rowSum(k) the number of 1 s in k th row. So, if nCol ~= sum( rowSum ) it would be impossible to construct such matrix: you would either have columns with no 1 s, or columns with too many 1 s...

Therefore, your binary matrix is completely defined through rowSum - up to random permutation of its columns.

How about this function to construct the basic matrix 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 );

Now you can use randperm to randomly permute the order of the columns:

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

Good luck with your thesis.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM