最常见的向量,出现在100万个随机向量中

时间:2014-10-04 13:38:20

标签: matlab vector

我想找到最常出现的100万个生成的矢量。

生成的1 x 7向量将为vec=sort(randperm(50,7));

谢谢

1 个答案:

答案 0 :(得分:2)

我想我会很好并提供答案。我过早地说这将占用大量内存,但是做一些粗略的计算,你需要一个1000000 x 7 = 7000000个数字,因为你需要100万个7元素数组。假设double个数字(每个数字为8个字节),所需的内存总量为7000000 x 8B = 56MB,所以是的,我们可以处理这种类型的计算。

高绩效马克有一个非常有见地的暗示。基本上,为每行生成一个随机整数的1000000 x 7元素数组,范围从1到50,并确保它们按照您在帖子中的说明进行排序。

一旦我们这样做,我们可以使用unique - 特别是unique的第一个和第三个元素,并使用'rows'标志来表示该函数。这将做的是它将过滤掉所有行上的矩阵,并仅生成从unique的第一个元素返回的唯一行。 unique的第三个输出告诉您原始输入矩阵中特定行映射到的unique的第一个输出中的哪一行。

完成后,计算unique的第三个输出的mode,我们可以使用它来索引unique的第一个输出。换句话说:

% // Set seed for reproducibility
rng(1234);

%// For each row in our matrix, generate a random integer row of 7 elements ordered
A = arrayfun(@(x) sort(randperm(50,7)), 1:1000000, 'uni', 0);
B = vertcat(A{:});

%// Use unique in the fashion that I was talking about earlier
[C,~,counts] = unique(B,'rows');

%// Figure out which row occurs most frequently and show it:
frequent_vector = C(mode(counts),:);
disp(frequent_vector);

我将随机生成器种子设置为1234,以便您能够在结束时重现结果。在处理随机生成方法或处理随机性的任何事情时,设置种子以便其他人可以重现您的结果总是好的。

另外,请注意我使用arrayfun来调用randperm 1000000次以及对这些行进行排序。因为arrayfun的输出将是每个1 x 7 double数组的1000000个单元阵列,所以我使用vertcat来堆叠所有这些数组以最终得到1000000 x 7矩阵。我继续使用unique,然后计算最常出现的向量mode,然后显示此向量。因此,我得到的输出是:

frequent_vector =

     1    10    21    28    29    35    38

如果您想知道频繁向量发生的频率,可以指定mode的附加输出,告诉您特定向量的出现频率。换句话说:

[~,f] = mode(counts)

f = 

3

因此,这个特定的向量发生3次,是你的矩阵中出现的最多的向量。请记住,您正在生成1000000个7元素向量,因此生成两个相同向量的概率...即使您正在排序以确保正确的顺序...将会非常小,所以不要如果最常见的矢量不经常发生,那就会感到惊讶。