我想生成一个矩形矩阵A
,在闭区间[0,1]
中有条目,它满足以下属性:
(1) size(A) = (200,2000)
(2) rank(A) = 50
(3) nnz(A) = 100000
最好是A
中的非零元素会以指数方式衰减,或者至少是多项式衰减(我希望显着小于大值)。
显然(我认为......),最终归一化到[0,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)
}。
首先使用A=rand(200,50)*rand(50,2000)
生成具有指定等级的矩阵。现在满足条件(2)
,我像以前一样骚扰。直到现在我丢失了属性(2)
,因为矩阵几乎已经完全排名。
那么......有没有办法确保同时满足属性(2)
和(3)
?
P.S。我希望矩阵中的非零条目以某种随机/非结构方式分布(只需要制作50个非零列或行就不是我的目标......)。
答案 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