MATLAB - 创建伪随机稀疏矩阵

3
有没有一种简单的方法可以创建一个具有特定非零条目数的“随机”稀疏矩阵?
这是我的尝试:
r = randperm(n,m) % n = size of matrix, m = number of nonzeros in each column
H = sparse(r, r,1,n,n);

但是矩阵H并不是每一列都有恰好m个非零元素。例如,如果我使用这种方法创建一个100 x 100的矩阵,并且每一列只有10个非零元素,则只有10列中恰好有10个1。

我相信有一种简单的方法可以解决这个问题,但我还没有找到。


你想要每列中具有特定数量的非零元素,还是整个矩阵中具有特定数量的非零元素就足够了?顺便说一句:我怀疑你的尝试不会产生每列多于一个条目的矩阵,因为它只在对角线上的随机位置生成“1”。 - knedlsepp
@knedlsepp 理想情况下,矩阵每列应具有特定数量的非零元素。 矩阵 H = randweb(100,10) 具有 955 个非零元素,我想附加 spy 绘图,但我的声望不够高。 - user78655
2个回答

3
这将生成一个100×100的矩阵,每列恰好有十个1
n = 100;
m = 10;
nonzerosPerColumn = repmat(m, 1, n);
%%// Build vector of linear indices to nonzero entries
pos = cell2mat(arrayfun(@(i)randperm(n,nonzerosPerColumn(i))+(i-1)*n,1:n,'uni',0));
%%// Generate the matrix
M = reshape(sparse(pos,1,1,n*n,1),n,n);

2

以下是矢量化方法:

r = 100;  %// number of rows
c = 100;  %// number of columns
m = 10;   %// number of ones that there should be in each column
H = sparse([], [], [], r, c, c*m);     %// preallocate and initiallize to zero
[~, ind] = sort(rand(r,c));            %// randomly generate...
ind = ind(1:m,:);                      %// ... m row indices per column
H(bsxfun(@plus, ind, (0:c-1)*r)) = 1;  %// fill in ones, using linear indexing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接