如何构建128x32加扰矩阵?

时间:2014-01-08 13:13:24

标签: matlab vb.net-2010

如何在 vb.net Matlab 中构建一个包含128行和32列的加扰矩阵?

矩阵的条目是介于1和32之间的数字,条件是每行不得包含重复元素,且行不得重复。

3 个答案:

答案 0 :(得分:4)

这类似于@thewaywewalk's answer,但是通过测试它是否确实矩阵没有重复行,并且在这种情况下生成一个新矩阵:

done = 0;
while ~done
    [~, matrix] = sort(rand(128,32),2);
    %// generate each row as a random permutation, independently of other rows.
    %// This line was inspired by randperm code
    done = size(unique(matrix,'rows'),1) == 128;
    %// in the event that there are repeated rows: generate matrix again 
end

如果我的计算是正确的,那么矩阵重新占据行的概率(因此必须再次生成)小于

>> 128*127/factorial(32)
ans =
  6.1779e-032

嘿,cosmic ray更有可能破坏程序的运行!所以我想你可以安全地删除while循环: - )

答案 1 :(得分:2)

使用randperm,您可以生成一行:

row = randperm(32)

如果此向量不会那么长,您可以使用perms查找所有排列

B = perms(randperm(32))

但是内存太多了!(32!= 2.6313e + 35行


所以你可以使用一个小循环:

N = 200;    

A = zeros(N,32);
for ii = 1:N
    A(ii,:) = randperm(32);
end

B = unique(A, 'rows');
B = B(1:128,:);

对于我的测试,直接使用N = 128并跳过最后两行就足够了,因为在2.6313e + 35可能的排列中,第一次尝试获得正确矩阵的概率非常高。但是为了确保没有行重复,请选择更高的数字,最后选择前128行。如果输入向量相对较短并且所需行的数量接近可能排列的总数,则使用建议的perms(randperm( n ))


对于从 1 4 的整数,以及选择 24个可能的排列,

小例子

N = 20;    
A = zeros(N,4);
for ii = 1:N
    A(ii,:) = randperm(4);
end
B = unique(A, 'rows');
B = B(1:10,:);

返回:

B =

     1     2     3     4
     1     2     4     3
     1     3     4     2
     2     3     1     4
     2     3     4     1
     2     4     1     3
     2     4     3     1
     3     1     2     4
     3     1     4     2
     3     2     1     4

选择N

的一些补充说明

我进行了一些测试运行,我使用上面的循环来查找像<{1}}这样的所有排列。对于permsn=4的向量长度,并且在每种情况下n=7:行的 60-80%是唯一的。 因此对于小N = factorial(n)我建议选择n如下,绝对安全:

N

其中N = min( [Q factorial(n)] )*2; 是您想要的排列数。对于较大的Q,您在搜索所有排列时会耗尽内存,或者与所有可能排列的数量相比,所需的子集非常小,以至于不太可能重复! (由Luis Mendo联系的宇宙射线理论)

答案 2 :(得分:0)

您的要求非常宽松,允许多种不同的可能性。我能想到的最有效的解决方案满足这些要求如下:

p = perms(1:6);
[p(1:128,:) repmat(7:32,128,1)]
相关问题