使用matlab查找整个数组的连续正负元素

时间:2017-03-07 18:21:32

标签: matlab

我有一个频道,我从中获取了大约100万个样本,现在它包含正值和负值。我的目的是找到连续的正整数和负整数(不必相同),一旦找到值,我就可以对它执行一些操作。我在下面给出了我的代码。 chA是我从中导出输入值的通道。代码只给了我43.2600的值,理想情况下应该给出一个数组,因为有很多样本连续正负。

consider the array as [0,1,-3,4,5,6,7,8,9,-19]
for i = 1:1000000 % loops strats from 1 and ends at 1000000
if (chA(i)<0) && (chA((i+1) >0)) % if i = 1, i+1 = -3 <it satisfy the condition>
tan = ((chA(i+1))- chA(i)); %calculate it
deltaOfTime = tan/i; %store the value here in the vector deltaOfTime
end
now in the next iteration it should be able to find out the next consecutive positive and negative value which is 9,-19

2 个答案:

答案 0 :(得分:0)

您应该保存您计算的每个值,而不是在每个循环中覆盖它:

deltaOfTime = zeros(1,1000000);
for i = 1:1000000 % loops strats from 1 and ends at 1000000
    if (chA(i)<0) && (chA((i+1) >0)) % if i = 1, i+1 = -3 <it satisfy the condition>
    tan = ((chA(i+1))- chA(i)); %calculate it
    deltaOfTime(i) = tan/i; %store the value here in the vector deltaOfTime
end

然而,有更好的方法来计算过渡,你不需要循环信号,或预先分配大向量deltaOfTime

这是一种不预先分配值的方法,但是随着数组在循环中的变化,它可能会变慢:

for i = 1:1000000 % loops strats from 1 and ends at 1000000
    if (chA(i)<0) && (chA((i+1) >0)) % if i = 1, i+1 = -3 <it satisfy the condition>
    tan = ((chA(i+1))- chA(i)); %calculate it
    deltaOfTime = cat(2,deltaOfTime,tan/i); %store the value here in the vector deltaOfTime
end

另一个尝试纠正代码中的所有错误:

for i = 1:length(chA)-1
    if (chA(i)<0) && (chA((i+1) >0))
        temp = ((chA(i+1))- chA(i));
        deltaOfTime = cat(2,deltaOfTime,temp/i);
    end
end

修正了if语句,以及一个循环条件,如果你的数组正好是1百万长,它会给你一个错误。

注意:避免使用现有功能的变量名称,例如tan

注意2:您确定不希望tandeltaOfTime的定义都在if - 声明中吗?

答案 1 :(得分:0)

我认为这就是你要做的......

origVec=[0,1,-3,4,5,6,7,8,9,-19];

yTemp=origVec(:); %make a column vector
yTemp = [NaN; yTemp; NaN]; %NaN pad

iTemp = (1:numel(yTemp)).'; %Get index array

% keep only the first of any adjacent pairs of equal values (including NaN).
yFinite = ~isnan(yTemp);
iNeq = [true;((yTemp(1:end-1) ~= yTemp(2:end)) & ...
(yFinite(1:end-1) | yFinite(2:end)))];
iTemp = iTemp(iNeq);

% take the sign of the first sample derivative
s = sign(diff(yTemp(iTemp)));

% find local maxima
iMax = [false;diff(s)<0];
iPk = iTemp(iMax)-1;

pksAndFollowingIdx = [iPk.';iPk.'+1]; %get neighbouring +ve and -ve values
deltaOfTime = diff(origVec(pksAndFollowingIdx))./iPk.'; %take difference between consecutive positive and negative values

也就是说,如果您的原始代码应该更像是:

for i = 1:10-1 % loop through array???
    if (origVec(i)>0) && (origVec(i+1) <0) % check neighbouring +ve THEN -ve values???
        tan12 = ((origVec(i+1))- origVec(i)); %calculate difference???
        deltaOfTime(i) = tan12/i % deltaOfTime, not sure how this is "delta of time"???
    end
end