生成具有N个非零元素的随机稀疏矩阵

时间:2017-07-19 16:02:28

标签: matlab

我编写了一个生成大小为nxd的稀疏矩阵的函数
并在每列中放入2个非零值。

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。

我不能使用this thread in Firebird-support,因为它需要密度,我需要非零条目的数量与矩阵大小不相关。并且给出密度基本上可以与矩阵大小相关。

我对如何选择指数并填充它们感到有点困惑......我做了一个非常昂贵的循环并且会很感激帮助。

修改
一切都必须稀疏。如果我不以稀疏方式执行,那么足够大的矩阵将在内存中崩溃。

1 个答案:

答案 0 :(得分:3)

你好像很亲密!

您可以在1和矩阵中的元素数之间选择num_nnz个随机(唯一)整数,然后将值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