【问题标题】:Using percentage function with accumarray使用带有 accumarray 的百分比函数
【发布时间】:2015-08-18 14:06:14
【问题描述】:

我有两个数组:

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”。

非常感谢。

【问题讨论】:

    标签: arrays matlab percentage accumarray


    【解决方案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
    

    【讨论】:

    • @chinkare_16 欢迎您。顺便说一句,当您有时间接受我们的任何一个答案时,您会更好地满足您的问题
    • @SanthanSalai - 因为 OP 想要通过 accumarray 的方法,所以接受的答案应该是你的,就像你按照 OP 的要求做的那样。我提供了一个替代方案,因为在这种情况下(至少在我看来)accumarray 会更慢。
    • @SanthanSalai 现在你是 3k 用户了...恭喜 :-)
    • @kkuilla LOL 谢谢 :)
    • 我不小心投了反对票。为了改变我的投票,我不得不编辑你的帖子。一旦过了一定的宽限期,它就不会让你改变你的投票。也忘了点赞!
    【解决方案2】:

    这是另一种不使用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 使用要计数的箱作为这个确切的列表。如果您使用的是更新版本的 MATLAB,请改用 histcounts... 相同的语法。一旦我们找到PCORorder 中每个值的元素总数,我们只需计算有多少元素对应于PCORorder 其中AprefCOR == 1 然后计算百分比,您只需将此列表中的每个条目除以总数上一个列表中的元素数。

    它将为您提供与accumarray 相同的结果,但开销更少。

    【讨论】:

    • 没有 accumarray 很好 :) 我们的逻辑虽然结束了相似 :) +1
    • @SanthanSalai - 呵呵 :) TBH,去年我穿的和你一模一样。我开始在这里写答案......我开始向 Luis Mendo、Divakar、Amro 等学习东西......我通常会写答案,然后那些人会建议一些让我的代码看起来很糟糕的东西哈哈。我很佩服你开始写答案,我开始看到你写答案的方式很成熟......从没有使用很多 MATLAB 函数的答案到使用更多函数并用更少的代码得到答案.你已经取得了很大的进步。继续加油!
    • 听到你的赞美真是太棒了 :) 对你们表示感谢。虽然仍然是 matlab 的孩子(
    • @SanthanSalai 所以今天是假期?我认为每个人都取得了巨大的进步,因为他们凌晨 4 点就起床了,就像 rayryeng :-)
    • 凌晨 4 点:P。我住在加拿大多伦多。
    【解决方案3】:

    您的方法有效,您只需要定义一个适当的anonymous function 以供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);
    

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 2021-08-06
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2020-08-08
      • 2021-09-18
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多