我编写了一个生成大小为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,因为它需要密度,我需要非零条目的数量与矩阵大小不相关。并且给出密度基本上可以与矩阵大小相关。
我对如何选择指数并填充它们感到有点困惑......我做了一个非常昂贵的循环并且会很感激帮助。
修改
一切都必须稀疏。如果我不以稀疏方式执行,那么足够大的矩阵将在内存中崩溃。
答案 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