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

use*_*182 4 matlab matrix vectorization

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

  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
Run Code Online (Sandbox Code Playgroud)

Sha*_*hai 6

并不总是可以构造满足您要求的二进制矩阵.假设你想要大小的二进制矩阵nRowsX nColsrowSum(长度的矢量nRows)rowSum(k)的数目1S IN k第i行.所以,如果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 );
Run Code Online (Sandbox Code Playgroud)

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

nb = b(:, randperm(size(b,2)) );
Run Code Online (Sandbox Code Playgroud)

祝你的论文好运.

  • @HighPerformanceMark:OP现在实际上将它变成了一个有效的问题,如前所述,代码不太可能成为论文的主要部分.写某人的论文是不道德的.在论文的细节上寻求帮助肯定不是; 你甚至可以说*否认*帮助是不道德的.我会+1 -1,因为它根本就不值得. (2认同)