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)
行ones
和zeros
定义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
,e
和f
在pop
.
我想最终得到以下列表:
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时)并且似乎必须有更快的方法?
您可以使用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)