我正在尝试创建一些代码来做这样的事情:在时间序列中,当v从负到正时,这与其他零交叉(左和右方向)至少相隔4天,如果我向右取8个元素(从零交叉),至少80%的天是正的,如果我把6个元素向左(从零交叉),至少60%的天是负的。满足这些条件的系列将随职位一起添加书签或保存。
谢谢你的帮助。。
v=[-1 2 3 -9 -8 -6 -7 -9 -3 -2 -5 -6 -3 1 6 8 5 9 7 4 5 6 -5 -7 2 5 3 2 -2 -1 -5 -4 1 4 3 5 6 3 4 3 -4 5]使用这个程序,我可以提取当值从正值变为负值时的位置,反之亦然。
vexample=v;
vexample(vexample >= 0) = 1;
vexample(vexample < 0) = -1;
z = vexample > 0;
id = find([true;diff(vexample.') ~= 0]);
k = diff([id;numel(vexample)+1]);
out = -k;
out(z(id)) = k(z(id));
clear id k vexample z
out = -1 2 -10 9 -2 4 -4 8 -1 1现在,我正在尝试检测系列中满足条件的部分,但我遇到了问题
发布于 2013-07-16 02:28:06
老实说,我认为你把自己和这个问题的读者弄糊涂了,这超出了你的需要。从上面的代码看,你似乎精通MATLAB,所以我给你的答案是把它分成几个部分。
首先找出零交叉的所有索引(我想这就是id?)
现在,您可以让它变得简单,并消除彼此之间在4以内的索引。使用for循环和if语句使向量无效(在4以内)。在您的for循环通过之后,删除它们。
老实说,我甚至不清楚你在这一部分想要做什么:
如果我从右边取8个元素(从零交叉点),至少80%的天是正的,如果我从左边(从零交叉点)取6个元素,至少60%的天是负的。
但是,通过一些基本的if语句,这应该很容易。
所有很酷的编程项目都是一步一步完成的,这也是我建议你开始的方式。
发布于 2013-07-16 03:46:23
这很让人困惑。实际上,我发现最好的做法是退后一步,重新定义我所需要的代码/数学,而不是文字。例如,而不是
8元素(从零交叉)向右,至少80%的天数是正的
试一试
%Find all N such that
sum(sign(v((N):(N+7)))) >= ceil(0.60 * 8)这自然会引出一些问题,比如(N+7)或(N+8)。
我已经为你的需求段落做了一个简单的尝试:
%Given the input
v=[-1 2 3 -9 -8 -6 -7 -9 -3 -2 -5 -6 -3 1 6 8 5 9 7 4 5 6 -5 -7 2 5 3 2 -2 -1 -5 -4 1 4 3 5 6 3 4 3 -4 5];
%Find all N such that
% **** low to high zero crossing
% (1) v(N) > 0
% (2) v(N-1) < 0
% **** +/- 4 days of no zero crossings
% (3) all(v((N-5):(N-1)) < 0)
% (4) all(v((N):(N+4)) > 0)
% **** +/- 8 days of rare zeros crossings
% (3) sum(sign(v((N-8):(N-1)))) <= - floor(0.60 * 8)
% (4) sum(sign(v( (N):(N+7)))) >= ceil(0.80 * 8)在这一点上(一旦你同意我的翻译),编写适当的循环就很容易了:
%Simple loop
maskResult = false(size(v));
vSign = sign(v);
for ix = 9:(length(v)-8)
if ...
all(vSign((ix-5):(ix-1)) < 0) && ...
all(vSign((ix):(ix+4)) > 0) && ...
sum(sign(vSign((ix-8):(ix-1)))) <= - floor(0.60 * 8) && ...
sum(sign(vSign( (ix):(ix+7)))) >= ceil(0.80 * 8)
maskResult(ix) = true;
end
end您可以使用以下命令检查结果
find(maskResult) %returns 14, indicating the -3 -> 1 transitionhttps://stackoverflow.com/questions/17660809
复制相似问题