【问题标题】:Count numbers of consecutive 1s and 0s in a vector计算向量中连续 1 和 0 的数量
【发布时间】:2013-09-08 13:02:47
【问题描述】:

在 Matlab 中,我有一个看起来像这样的向量:

0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1

我现在要做的是计算这个向量中 1 的个数。连续的 1 算作 1。此外,我还想计算 1 之间 0 的平均数和中位数。所以对于这个例子:

1 秒:5

中位数 0:3.5

平均 0:3

我使用蛮力方法解决了这个问题,即循环调查每个元素并检查前一个元素和下一个元素。但我确信必须有一个更快的解决方案。有什么想法吗?

【问题讨论】:

  • 您能告诉我这里的平均数和中位数是如何计算的吗?我有一个连续 1 的解决方案
  • 计数应该像这样工作:vector*[1;1-vector(1:end-1)']。如果向量是布尔值,则可能必须将向量转换为“double”。不幸的是,这并不能解决中间零的平均数量问题。
  • @P0W 在第一个 1 之后有 3 次 0,然后在下一个连续 1 块之后有 4 次 0,然后是 4,然后是 1。所以我计算序列的平均值和中位数 3 4 4 1.
  • @ElianT 只计算 个之间的零

标签: matlab


【解决方案1】:

给定向量v中的数据,

v = [ 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 ]; % data

计算如下:

w = [ 1 v 1 ]; % auxiliary vector
runs_zeros = find(diff(w)==1)-find(diff(w)==-1); % lenghts of runs of 0's

% Desired results:
number_ones = length(runs_zeros)-1+v(1)+v(end);
% For average and median, don't count first run if v(1) is 0,
% or last run if v(end) is 0:
average_runs_zeros = mean(runs_zeros(2-v(1):end-1+v(end))); 
median_runs_zeros = median(runs_zeros(2-v(1):end-1+v(end)));

这比@TryHard 的解决方案更快,因为它不需要转换为字符串

【讨论】:

    【解决方案2】:

    好的,所以这似乎有效

    >> a=[0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1];
    >> %Remove traling and leading zeros
    >> y = a(find(a,1,'first'):find(a,1,'last'));
    >> q = diff([0 a 0] == 1);
    >> v = find(q == -1) - find(q == 1);
    >> length(v) % Consecutive Ones
    ans =
    
         5
    
    >> q = diff([0 ~y 0] == 1);
    >> v = find(q == -1) - find(q == 1);
    >> v
    
    v =
    
         3     4     4     1
    
    >> median(v)
    
    ans =
    
        3.5000
    
    >> mean(v)
    
    ans =
    
        3
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      dat=[0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1];
      str = regexprep(num2str(dat),' ','');
      [n1 istart1 iend1] = regexp(str,'[1]+','match','start','end');
      [n0 istart0 iend0] = regexp(str(min(istart1):max(iend1)),'[0]+','match','start','end');
      
      % number of strings of `1`s
      length(n1)
      
      % property of intercalated strings of `0`s
      median([iend0-istart0+1])
      mean([iend0-istart0+1])
      

      【讨论】:

      • 使用正则表达式是个好主意……但它会减慢计算速度;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2021-02-21
      • 2021-02-18
      相关资源
      最近更新 更多