簡體   English   中英

構造一個二進制矩陣,使得每一列僅包含單個“ 1”,並且每一行的總和具有期望的值

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

我想構造一個滿足以下約束的二進制(0s和1s)矩陣:

  1. 每列必須僅包含單個二進制1,並且該列的其余元素為0。

  2. 矩陣的每個ROW的總和應為所需值。 例如,給定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

構造滿足您要求的二進制矩陣並不總是可能的。 假設您想要一個大小為nRows x nCols的二進制矩陣,其中rowSum (長度為nRows的向量) rowSum(k)在第k行中的個數為1 s。 因此,如果nCol ~= sum( rowSum )則不可能構造這樣的矩陣:您將擁有無1 s的列,或具有過多1 s的列...

因此,您的二進制矩陣是通過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)) );

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM