在 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 的平均值和中位数。所以对于这个例子:
1s: 5
0 中位数:3.5
平均 0:3
我用蛮力方法解决了这个问题,即研究循环中的每个元素并检查前一个和下一个元素。但我确信必须有一个更快的解决方案。任何想法?
给定向量中的数据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 的解决方案更快,因为它不需要转换为字符串
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)