在matlab中,找到矩阵中唯一行出现的频率

use*_*089 1 arrays matlab matrix

在Matlab中,我说有以下矩阵,代表10个人口:

pop = [0 0 0 0 0; 1 1 1 0 0; 1 1 1 1 1; 1 1 1 0 0; 0 0 0 0 0; 0 0 0 0 0; 1 0 0 0 0; 1 1 1 1 1; 0 0 0 0 0; 0 0 0 0 0];
Run Code Online (Sandbox Code Playgroud)

oneszeros定义6个不同"类型"的个体.

a = [0 0 0 0 0];
b = [1 0 0 0 0];
c = [1 1 0 0 0];
d = [1 1 1 0 0];
e = [1 1 1 1 0];
f = [1 1 1 1 1];
Run Code Online (Sandbox Code Playgroud)

我想定义的比例/频率a,b,c,d,efpop.

我想最终得到以下列表:

a = 0.5;
b = 0.1;
c = 0;
d = 0.2;
e = 0;
f = 0.2;
Run Code Online (Sandbox Code Playgroud)

我能想到的一种方法是对行进行求和,然后计算每个行的出现次数,然后进行排序和索引

sum_pop = sum(pop')';
x = unique(sum_pop);
N = numel(x);
count = zeros(N,1);
   for l = 1:N
      count(l) = sum(sum_pop==x(l));
   end
pop_frequency = [x(:) count/10];
Run Code Online (Sandbox Code Playgroud)

但这并不能让我得到我想要的东西(即当频率= 0时)并且似乎必须有更快的方法?

Lui*_*ndo 5

您可以使用pdist2(统计工具箱)获取所有频率:

indiv = [a;b;c;d;e;f]; %// matrix with all individuals
result = mean(pdist2(pop, indiv)==0, 1);
Run Code Online (Sandbox Code Playgroud)

在您的示例中,这给出了

result =
    0.5000    0.1000         0    0.2000         0    0.2000
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用bsxfun手动计算pdist2(pop, indiv)==0,如Divakar的答案.


对于您示例中的特定个体(可以通过其数量来识别),您也可以这样做

result = histc(sum(pop, 2), 0:size(pop,2)) / size(pop,1);
Run Code Online (Sandbox Code Playgroud)