【问题标题】:repeat a value in a matrix for a matching ID (MATLAB)为匹配的 ID 在矩阵中重复一个值(MATLAB)
【发布时间】:2015-08-06 19:11:18
【问题描述】:

我需要您的帮助来解决以下问题。 Column1 显示按整数分组。 Col2 中的任何非 nan 值都应插入到矩阵中以匹配 groupnumber(Col1)。

mat = [ ...
        1  nan 
        1  0.1
        1  nan
        1  nan
        2  nan
        2  nan
        2  nan
        3  0.5
        4  nan
        4  nan
        4  nan
        5  0.2
        5  nan ] ;

ans = [ ...
        1  0.1 
        1  0.1
        1  0.1
        1  0.1
        2  nan
        2  nan
        2  nan
        3  0.5
        4  nan
        4  nan
        4  nan
        5  0.2
        5  0.2 ] ;

请推荐一种矢量化方法。数据量很大,并且已经在 for 循环中运行。一个组内(在 mat 中)永远不会有多个非 nan 值(col2)。谢谢!

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    使用ACCUMARRAY 的解决方案将实现您的目标:

    values = accumarray(mat(:,1),mat(:,2),[],@min);
    mat(:,2) = values(mat(:,1));
    

    为了方便起见,我在这里使用函数MIN,因为如果有一个值,它将返回非NaN 值,或者如果只有一个值,则返回NaN。它比使用函数ISNAN 检查任何非NaN 值所涉及的逻辑要简单。您实际上也可以使用函数MAX,因为在这种情况下它的行为方式相同。

    【讨论】:

    • 感谢新手!我真的需要熟悉 accumarray!
    • @Maddy:描述不完整:如果你在同一个组中有多个非nan值(不同的值),你想用min替换相同的nan吗组?
    • @Amro - 感谢您指出这一点。我已经编辑了 Q。一个组中不能有多个非 nan 值。在现实生活中,这些值是月末汇率。组是从上个月中旬到下个月的(中旬1)天。我应该从 Gnovice 的代码中删除 @min 吗?我不太了解 accumarray 的权力。
    • @Maddy:我添加了一个额外的解释来解释我为什么使用@min
    • @gnovice...我已经实现了,结果又好又快!
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2011-10-27
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多