在 accumarray 中使用百分比函数
Using percentage function with accumarray
我有两个数组:
OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65,...]
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2,...]
对于 OTPCORorder 中的每个元素,AprefCOR 中都有对应的元素。
我想知道每组唯一 OTPCORorder 的数字 1 的百分比如下:
OTPCORorder1 = [61,62,65,...]
AprefCOR1 = [1,0.72,0,...]
我已经有了这个:
[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
ANS = OTPCORorder1 = [61,62,65,...];
我曾经使用 "accumarray" 但我使用 "mean" 或 "sum" 函数,例如:
AprefCOR1 = accumarray(idx,AprefCOR,[],@mean).';
我只是想知道是否存在使用此方法的方法,但使用 "prctile" 函数或任何其他函数可以给出特定元素的百分比,例如在本例中为“1”。
非常感谢。
这可能是一种方法:
%// make all those non-zero values to zero
AprefCORmask = AprefCOR == 1;
%// you have done this
[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
%// Find number of each unique values
counts = accumarray(idx,1);
%// Find number of ones for each unique value
sumVal = accumarray(idx,AprefCORmask);
%// find percentage of ones to get the results
perc = sumVal./counts
结果:
输入:
OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65];
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2];
输出:
perc =
1.0000
0.7273
0
这是另一种不使用 accumarray
的方法。我认为它更具可读性:
>> list = unique(PCORorder);
>> counts_master = histc(PCORorder, list);
>> counts = histc(PCORorder(AprefCOR == 1), list);
>> perc = counts ./ counts_master
perc =
1.0000 0.7273 0
上面代码的工作原理是,我们首先在 PCORorder
中找到那些唯一的元素。一旦我们这样做了,我们首先计算有多少元素属于 PCORorder
中的每个唯一值,而不是 histc
using the bins to count at as this exact list. If you're using a more newer version of MATLAB, use histcounts
...相同的语法。一旦我们找到 PCORorder
中每个值的元素总数,我们只需计算 PCORorder
其中 AprefCOR == 1
对应的元素数量,然后计算百分比,只需将每个条目相除即可在此列表中包含上一个列表中的元素总数。
它会为您提供与 accumarray
相同的结果,但开销更少。
您的方法有效,您只需要定义一个合适的anonymous function to be used by accumarray
。让 value = 1
成为您要计算其百分比的值。那么
[~, ~, u] = unique(OTPCORorder); %// labels for unique values in OTPCORorder
result = accumarray(u(:), AprefCOR(:), [], @(x) mean(x==value)).';
作为替代方案,您可以使用 sparse
,如下所示。生成一个两行矩阵,使得每一列对应于 OTPCORorder
中的一个可能值。第一行记录 OTPCORorder
中的每个值在 AprefCOR
中具有所需值的次数;第二行记录了它没有的次数。
[~, ~, u] = unique(OTPCORorder);
s = full(sparse((AprefCOR==value)+1, u, 1));
result = s(2,:)./sum(s,1);
我有两个数组:
OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65,...]
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2,...]
对于 OTPCORorder 中的每个元素,AprefCOR 中都有对应的元素。 我想知道每组唯一 OTPCORorder 的数字 1 的百分比如下:
OTPCORorder1 = [61,62,65,...]
AprefCOR1 = [1,0.72,0,...]
我已经有了这个:
[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
ANS = OTPCORorder1 = [61,62,65,...];
我曾经使用 "accumarray" 但我使用 "mean" 或 "sum" 函数,例如:
AprefCOR1 = accumarray(idx,AprefCOR,[],@mean).';
我只是想知道是否存在使用此方法的方法,但使用 "prctile" 函数或任何其他函数可以给出特定元素的百分比,例如在本例中为“1”。
非常感谢。
这可能是一种方法:
%// make all those non-zero values to zero
AprefCORmask = AprefCOR == 1;
%// you have done this
[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
%// Find number of each unique values
counts = accumarray(idx,1);
%// Find number of ones for each unique value
sumVal = accumarray(idx,AprefCORmask);
%// find percentage of ones to get the results
perc = sumVal./counts
结果:
输入:
OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65];
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2];
输出:
perc =
1.0000
0.7273
0
这是另一种不使用 accumarray
的方法。我认为它更具可读性:
>> list = unique(PCORorder);
>> counts_master = histc(PCORorder, list);
>> counts = histc(PCORorder(AprefCOR == 1), list);
>> perc = counts ./ counts_master
perc =
1.0000 0.7273 0
上面代码的工作原理是,我们首先在 PCORorder
中找到那些唯一的元素。一旦我们这样做了,我们首先计算有多少元素属于 PCORorder
中的每个唯一值,而不是 histc
using the bins to count at as this exact list. If you're using a more newer version of MATLAB, use histcounts
...相同的语法。一旦我们找到 PCORorder
中每个值的元素总数,我们只需计算 PCORorder
其中 AprefCOR == 1
对应的元素数量,然后计算百分比,只需将每个条目相除即可在此列表中包含上一个列表中的元素总数。
它会为您提供与 accumarray
相同的结果,但开销更少。
您的方法有效,您只需要定义一个合适的anonymous function to be used by accumarray
。让 value = 1
成为您要计算其百分比的值。那么
[~, ~, u] = unique(OTPCORorder); %// labels for unique values in OTPCORorder
result = accumarray(u(:), AprefCOR(:), [], @(x) mean(x==value)).';
作为替代方案,您可以使用 sparse
,如下所示。生成一个两行矩阵,使得每一列对应于 OTPCORorder
中的一个可能值。第一行记录 OTPCORorder
中的每个值在 AprefCOR
中具有所需值的次数;第二行记录了它没有的次数。
[~, ~, u] = unique(OTPCORorder);
s = full(sparse((AprefCOR==value)+1, u, 1));
result = s(2,:)./sum(s,1);