2016-05-23 8 views
0

ランダムに作成されたスパース行列がすべての行と列に非ゼロ要素を持つようにする簡単な方法はありますか?ゼロ以外の列と行を含むランダムなスパース行列を作成する

Iは、M * N行列

Matrix=sprand(m,n,0.3) 

を作成するsprandを試みたが、非ゼロの行または列が見つかったことが時々ありました。

私はまた、行として疎ベクトルを作成し、行の後の行を行列に追加して行列を作成しようとしました。

編集:私はrxampleのための5 * 5行列の小さなサイズの行列を探しています

+0

このように、すべての行とすべての列に少なくとも1つの非零要素が必要ですか?密度は正確に「0.3」でなければならないのか、それとも何か近くにあるのであれば十分でしょうか?私。 OK行列を作成する場所に乱数を挿入しても問題ありませんか? –

+0

おおよそ、あなたのマトリックスはどれくらいですか? –

+0

あなたのコメントをありがとう、私は密度が0.5未満であり、非ゼロ要素の場所がランダムである必要があります。行列のサイズは5×5程度の小さな行列です – OBtli

答えて

2

手動でインデックスを作成します。スパース性の

m = 10; 
n = 8; 
p = 0.3; 

r = repmat(randperm(m), 1, n); 
c = repmat(randperm(n), 1, m); 
row_idx = r(1:ceil(p*m*n)); 
col_idx = c(1:ceil(p*m*n)); 
ran_num = rand(1, ceil(p*m*n)); 

s = sparse(row_idx, col_idx, ran_num, m, n); 
full(s) 

    0.1842   0   0   0 0.0133   0 0.0620   0 
     0   0   0   0 0.2999   0 0.1967   0 
     0   0   0 0.1341   0   0   0 0.0934 
     0   0 0.4561   0   0   0   0 0.8949 
    0.1017 0.0715   0   0   0   0   0   0 
    0.0538 0.7363   0   0 0.3321   0   0   0 
     0   0 0.5619 0.2973   0 0.4417   0   0 
     0   0   0 0.8972   0 0.5972   0   0 
     0   0 0.2425   0   0 0.9954   0 0.7455 
     0 0.3074   0   0   0   0 0.2126   0 

テスト:

nnz(s)/numel(s)  
ans =  
    0.3000 

以下は小さな例です。 0.5より小さい密度と5x5の寸法を持つことは不可能であり、すべての行と列にまだゼロでない要素があります。

m = 5; 
n = 5; 
p = 0.5; 

r = repmat(randperm(m), 1, n); 
c = repmat(randperm(n), 1, m); 
row_idx = r(1:ceil(p*m*n)); 
col_idx = c(1:ceil(p*m*n)); 
ran_num = rand(1, ceil(p*m*n)); 

s = sparse(row_idx, col_idx, ran_num, m, n); 
full(s) 

ans = 

    1.8078   0   0   0   0 
     0   0   0 0.7891   0 
     0 1.5096   0   0   0 
     0   0   0   0 1.0909 
     0   0 1.1130   0   0 
関連する問題