【问题标题】:Truncating an array截断数组
【发布时间】:2014-06-07 06:34:28
【问题描述】:

我的代码的简化版本如下:

A = linspace(0,10,100);
threshold = 6.0;

我想在低于阈值的值处截断向量 A。

假设 A 中的值总是递增的,我怎样才能巧妙而高效地做到这一点?

目前我能想到的唯一方法是引入一个for循环并逐个检查每个元素,如果它的值高于阈值,然后将这个值分配给一个新数组。像这样的:

    k=1;
    for i = 1:numel(A)
        if A(i) < threshold
        elseif A(i) >= threshold
            Atrunc(k,1) = A(i);
            k=k+1;
        end
    end 

然而这对我来说似乎不是很“好”,谁能提供更优化的代码...?

【问题讨论】:

  • 使用这种矢量化形式 - Atrunc = A(A&gt;=threshold)

标签: matlab


【解决方案1】:

使用逻辑索引

A = A(A < threshold);

A = A(A >= threshold);

【讨论】:

    【解决方案2】:

    由于A 中的值是递增的,因此您可以使用binary search 查找低于阈值的最后一个元素:

    threshold = 5; %// example data
    A = linspace(0,15,1e7); %// example data
    
    w = [1 numel(A)]; %// uncertainty window. Initiallize
    while w(2)>w(1)+1
        t = round((w(1)+w(2))/2); %// test middle point
        if A(t)<threshold
            w(1) = t; %// remove lower half of window
        else
            w(2) = t; %// remove upper half of window
        end
    end
    if A(w(2)) < threshold %// handle special cases: Atrunc is A or is []
        t = w(2);
    elseif A(w(1)) < threshold 
        t = w(1);
    else
        t = w(1)-1;
    end
    Atrunc = A(1:t);
    

    对于A large,这种方法(利用A 已排序的事实)可能比Atrunc = A(A &lt; threshold); 更快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 2018-03-12
      • 1970-01-01
      • 2018-01-28
      • 2018-11-27
      • 2012-09-22
      相关资源
      最近更新 更多