从matlab中向量的负值的出现中找出中位数的向量

时间:2017-08-15 11:46:36

标签: matlab

说我有一个载体

v =[1,2,3,-1,-2,-3,4,5,6,-7,-6,-3,-5,-4,...]

我想制作一个包含负值出现值的向量。

当指针位于v[4]时,直到最后一个负值v[6]

下一步我需要从第一次出现的负值

的矢量v中取中位数
Vm = [-2] % first occurrence

因此,我想重复v[10]v[13]的程序并再次确定中位数。

并将其添加到向量Vm = [-2,-3],依此类推。输出应如下所示:vm = [(median(v(4) to v(6)), (median(v(10) to v(13))),...]

因此,对于此示例,向量应如下所示vm = [-2,-4,...]

3 个答案:

答案 0 :(得分:4)

使用带有for循环的逻辑索引的一种可能性是

v =[1,2,3,-1,-2,-3,4,5,6,-7,-6,-3,-5,-4];
% find negative values
flg_negative=v<0;
%get start of interval
idx_start=find(diff(flg_negative)==1)+1;
%get end of interval
idx_end=find(diff(flg_negative)==-1);
%sanity check for beginning (if v(1) is negativ)
if idx_start(1)>idx_end(1)
    idx_start=[1 idx_start];
end
%if vector ends with a negative value adjust
if idx_start(end)>idx_end(end)
    idx_end=[idx_end length(v)];
end
%number of intervals
n=length(idx_start);
%alloc output
vm=zeros(n,1);
%loop over intervals
for kk=1:n
    %calc median
    vm(kk)=median(v(idx_start(kk):idx_end(kk)));
end

你应该检查flg_negative是否为空。

答案 1 :(得分:1)

一个简单的解决方案是使用for

 flag = 0;
 negs = [];
 medians = [];
 for idx = 1:length(v)
      % add to negs up to finding next positive
      if(v(idx) < 0)
          negs = [negs v(idx)];
          flag = 1; 
      % find median of founded negs and reset the negs and flag
      elseif(v(idx) > 0 && flag== 1)
           medians = [medians median(negs)];
           negs = [];
           flag = 0;
      end
 end

答案 2 :(得分:1)

v =[1,2,3,-1,-2,-3,4,5,6,-7,-6,-3,-5,-4]; %Given vector
%Start and end of intervals. strfind is applicable on numeric data as well.
pos = [1,v>=0,1];    start = strfind(pos,[1,0]);     last = strfind(pos,[0,1])-1;

n=length(start); %Number of chunks of the negative values
vm = zeros(1,n); %Pre-allocation of vm
for k=1:n
    vm(k) = median(v(start(k):last(k)));  %Finding required vector of medians   
end

如果没有负值,vm将作为空向量返回。

关于声明,“我想制作一个由负值出现的值组成的向量。”,似乎这不是你的实际目标,但你可以找到v(v<0)