生成具有特定等级和基数的随机矩阵

时间:2014-08-31 12:35:34

标签: matlab matrix

我想生成一个矩形矩阵A,在闭区间[0,1]中有条目,它满足以下属性:

(1) size(A) = (200,2000)
(2) rank(A) = 50
(3) nnz(A) = 100000

最好是A中的非零元素会以指数方式衰减,或者至少是多项式衰减(我希望显着小于大值)。 显然(我认为......),最终归一化到[0,1]并不是这里的主要问题。

我尝试的东西不起作用:

  1. 首先使用A=abs(randn(200,2000))和阈值

    生成随机矩阵
    th = prctile(A(:),(1-(100000/(200*2000)))*100);
    A = A.*(A>th);
    

    现在满足属性(3),我降低了等级

    [U,S,V] = svd(A);
    for i=51:200 S(i,i)=0; end
    A = U*S/V;
    

    但是这个矩阵几乎已经完全基数(我失去了(3)}。

  2. 首先使用A=rand(200,50)*rand(50,2000)生成具有指定等级的矩阵。现在满足条件(2),我像以前一样骚扰。直到现在我丢失了属性(2),因为矩阵几乎已经完全排名。

  3. 那么......有没有办法确保同时满足属性(2)(3)

    P.S。我希望矩阵中的非零条目以某种随机/非结构方式分布(只需要制作50个非零列或行就不是我的目标......)。

2 个答案:

答案 0 :(得分:0)

这满足所有条件,概率非常高:

A = zeros(200,2000);
A(:,1:500) = repmat(rand(200,50),1,10);

然后,如果需要,您可以填充非零列:

A = A(:,randperm(size(A,2)));

矩阵具有垂直结构:在500列中,所有元素都是非零,而在剩余的1500列中,所有元素都是零。 (不确定这是否可以接受)。

答案 1 :(得分:0)

琐碎的方法:

>> A= rand(200,50);
>> B= zeros(200,1950);
>> A = [A B];
>> A = A(:,randperm(size(A,2)));
>> rank(A)

ans =

    50

>> nnz(A)

ans =

       10000