【问题标题】:Sort array (duplicated data, 0 value and NaN)排序数组(重复数据、0 值和 NaN)
【发布时间】:2013-04-08 19:17:20
【问题描述】:

早上好/下午好~~

我必须对以下数组进行排序,并将某个值替换为 0。

A=[9 NaN 7 7 7 7 NaN 7 7 7 7 NaN 9 9 9 NaN 4 4 4 4 NaN ] 

% The output should be>>> 

A=[9 NaN 7 0 0 0 NaN 7 0 0 0 NaN 9 0 0 NaN 4 0 0 0 NaN ]

通过使用 unique() 函数,第二个 NaN 之后的 7 和第三个 NaN 之后的 9 将被 0 替换。 所以我只能得到结果:

[c, ia] =  unique(A, 'first');
t = A;
t(iA) =0;
A = A-t;

A=[9 NaN 7 0 0 0 NaN 0 0 0 0 NaN 0 0 0 NaN 4 0 0 0 NaN ]

我该如何解决这个问题?

任何帮助将不胜感激! 谢谢。

【问题讨论】:

    标签: matlab duplicates unique


    【解决方案1】:

    蛮力呢?

    % Data
    A_in = [9 NaN 7 7 7 7 NaN 7 7 7 7 NaN 9 9 9 NaN 4 4 4 4 NaN]; 
    
    % Processing
    A_out = zeros(size(A_in));
    prev_char = [];
    for ii=1:numel(A_in), 
        if A_in(ii)==prev_char
            A_out(ii)=0;
        else
            A_out(ii)=A_in(ii);
        end
        prev_char = A_in(ii);
    end
    

    【讨论】:

    • 很高兴我帮助了你。不要忘记接受有效答案以帮助社区。​​span>
    【解决方案2】:

    矢量化解决方案:

    % Flip A (or you will zero out every one in the sequence except the last one)
    B      = A(end:-1:1);
    dfB    = diff(B);
    idx    = ~isnan(dfB);
    B(idx) = dfB(idx);
    
    % Flip back into A
    A = B(end:-1:1)
    

    编辑 不创建B,就更晦涩了一点:

    dfA = diff(A(end:-1:1));
    A([false ~isnan(dfA(end:-1:1))]) = 0
    

    【讨论】:

    • 谢谢!!天哪,翻转方法太聪明了! =)
    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2016-05-12
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多