4

次の制約を満たすbinary(0sおよび1s)行列を作成したいと思います。

  1. 各列には単一のバイナリ1のみが含まれている必要があり、その列の残りの要素は0です。

  2. 行列の各行の合計は、目的の値である必要があります。たとえば、rowSum[5 7 6 8 .......]のベクトルが与えられた場合、最初の行の合計は5になり、2番目の行の合計は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

要件を満たすバイナリ マトリックスを作成できるとは限りません。番目の行の sの数(長さ のベクトル)を持つサイズnRowsxのバイナリ行列が必要であるとします。したがって、そのような行列を構築することが不可能な場合: s のない列、または s が多すぎる列のいずれかになります...nColsrowSumnRowsrowSum(k)1knCol ~= sum( rowSum )11

したがって、バイナリ行列は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 に答える