构造二进制矩阵,使得每列仅包含单个“1”,并且每行的总和具有期望值

时间:2013-01-17 13:22:16

标签: matlab matrix vectorization

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

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

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

  3. nCol == Sum(rowSum)

  4. 此外,我想考虑满足相同条件的几个(例如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
    

1 个答案:

答案 0 :(得分:6)

并不总是可以构造满足您要求的二进制矩阵。 假设您想要一个大小为nRows x nColsrowSum的二进制矩阵(长度为nRows的向量)rowSum(k) 1 s的数量在k行。 因此,如果nCol ~= sum( rowSum )构建此类矩阵是不可能的:您可能会有没有1的列,或者有1个太多的列...

因此,您的二进制矩阵完全通过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)) );

祝你的论文好运。