2016-05-23 101 views
0

是否有一種簡單的方法可以確保隨機創建的稀疏矩陣在所有行和列中都有非零元素?創建一個非零列和行的隨機稀疏矩陣

我試圖sprand創建m * n個矩陣

Matrix=sprand(m,n,0.3) 

但有時是一個非零的行或列中找到。

我也嘗試創建一個矩陣,通過創建一個稀疏向量作爲行,並在矩陣之後添加一行。

編輯:我在尋找一個小型矩陣5 * 5矩陣rxample

+0

所以你想要所有的行和所有列至少有一個非零元素?密度必須精確地爲'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