说我有一个载体
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,...]
答案 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)
。