2017-07-19 9 views
4

サイズがnxd
のスパース行列を生成する関数を作成し、各列に0以外の値を2つ入れます。N個の非零要素を持つランダムなスパース行列を生成する

function [M] = generateSparse(n,d) 
    M = sparse(d,n); 
    sz = size(M); 
    nnzs = 2; 
    val = ceil(rand(nnzs,n)); 
    inds = zeros(nnzs,d); 
    for i=1:n 
     ind = randperm(d,nnzs); 
     inds(:,i) = ind; 
    end 
    points = (1:n); 
    nnzInds = zeros(nnzs,d); 
    for i=1:nnzs 
     nnzInd = sub2ind(sz, inds(i,:), points); 
     nnzInds(i,:) = nnzInd; 
    end 
    M(nnzInds) = val; 
end 

しかし、私は別のパラメータにNUM-NNZそれがランダムにNUM-NNZ細胞を選択作り、そこに私ができる1

を置く機能を与えることができるようにしたいのですが密度が必要なのでsprandを使用してください。そして、マトリックスサイズから信頼できない数の非ゼロエントリが必要です。密度を与えることは、基本的にはマトリクスサイズに依存します。

インデックスを選択して記入する方法についてちょっと混乱しています...私は非常に高価で、助けに感謝するループでやりました。

編集:
すべてがスパースでなければなりません。私がまばらな方法でそれをしないと、十分に大きな行列がメモリにクラッシュします。

答えて

3

あなたは近くにいるようです。

1とマトリックスの要素数の間のランダムな(一意の)整数を選択し、それらの要素のインデックスに値1を割り当てることができます。

ランダムな一意の整数を選択するには、randpermを使用します。行列の要素数を取得するには、numelを使用します。

M = sparse(d, n); % create dxn sparse matrix 
num_nnz = 10;  % number of non-zero elements 
idx = randperm(numel(M), num_nnz); % get unique random indices 
M(idx) = 1;  % Assign 1 to those indices 
+0

それは仕事をしたようです。ありがとうございます。 –

関連する問題