【问题标题】:Generate random matrix with specific rank and cardinality生成具有特定秩和基数的随机矩阵
【发布时间】:2014-10-24 20:49:31
【问题描述】:

我想生成一个矩形矩阵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),因为矩阵几乎是满秩的。

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

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

【问题讨论】:

  • 我不确定非零模式能有多“随机”。如果您有 200 行,排名为 50,则基本上有 50 种不同的模式,每个模式重复大约 4 次。
  • 好吧,这是一个有趣的评论...我可以生成 50 个随机行 r_i 与 ~500 非零条目,并为矩阵的每一行随机选择 i。这不是我的目标,但总比没有好。

标签: matlab matrix


【解决方案1】:

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

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

然后,如果需要,您可以对非零列进行混洗:

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

矩阵具有垂直结构:在 500 列中,所有元素都不为零,而在其余 1500 列中,所有元素都为零。 (不确定这是否适合您的目的)。

【讨论】:

  • 对不起,但这不是我的目标...编辑了问题作为回应。
【解决方案2】:

简单的方法:

>> 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

【讨论】:

  • 不是我的意思...我希望矩阵的非零值也随机分布(或者至少使用不像上面建议的那样简化的模式)。跨度>
猜你喜欢
  • 2012-11-21
  • 2018-10-26
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多