0

我正在尝试创建一些代码来执行以下操作:在时间序列中,当 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

现在,我正在尝试检测符合条件的系列部分,但我遇到了问题

4

2 回答 2

2

老实说,我认为您使自己和这个问题的读者感到困惑的程度超出了您的需要。从上面的代码看起来你精通 MATLAB,所以我对你的回答是把它分成几部分。

首先找到零交叉的所有索引(我认为这就是 id 是什么?)

现在你可以让它变得简单一些,并消除彼此相距 4 以内的索引。使用 for 循环和 if 语句使向量无效(接近 4)。在你的 for 循环通过后,删除那些。

老实说,我不清楚您在这部分中甚至要做什么:

如果我将 8 个元素(从零交叉)移到右侧,则至少 80% 的天数为正,如果我将 6 个元素移到左侧(从零交叉),则至少 60% 的天数为负.

但这应该很容易使用一些基本的 if 语句..

所有很酷的编程项目都是一步一步完成的,我建议你也是这样开始的。

于 2013-07-15T18:28:05.717 回答
0

这很令人困惑。实际上,我发现最好退后一步,重新定义我在代码/数学中需要的东西,而不是文字。例如,而不是

8 个元素(从零交叉)向右,至少 80% 的天数为正

尝试

%Find all N such that
sum(sign(v((N):(N+7))))  >=    ceil(0.60 * 8)

这自然会引出一些问题,例如(N+7)or (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 transition
于 2013-07-15T19:46:23.440 回答