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

  • 本文关键字:向量 中位数 matlab 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,...]

使用带有 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是否不为空。

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)找到它。

一个简单的解决方案是使用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

最新更新