Tengo un canal del que tomo alrededor de 1 millón de muestras, ahora contiene valores positivos y negativos. Mi intención es encontrar los enteros positivos y negativos consecutivos (no tiene que ser el mismo) y una vez que se encuentra el valor, puedo realizar algunas operaciones en él. He dado mi código a continuación. chA es mi canal desde donde obtengo mis entradas como valores. El código solo me da un valor de 43.2600, que idealmente debería haber dado una serie de números, ya que hay muchas muestras que son consecutivas positivas y negativas.

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
0
jayanta deb 7 mar. 2017 a las 21:21

2 respuestas

La mejor respuesta

Creo que esto es lo que estás tratando de hacer ...

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

Es decir, si se suponía que su código original era algo más parecido a:

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
0
user5128199user5128199 7 mar. 2017 a las 20:17

Debe guardar cada uno de los valores que calcula en lugar de sobrescribirlos en cada ciclo:

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

Sin embargo, hay una mejor manera de calcular las transiciones y no necesitará recorrer su señal o preasignar el vector grande deltaOfTime.

Esta es una forma de no preasignar valores, sin embargo, podría ser más lento a medida que la matriz cambia dentro del bucle:

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

Otro intento de corregir todos los errores en el código:

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

Se corrigió la declaración if, así como la condición de bucle que le dará un error si la matriz tiene exactamente 1 millón de longitud.


Nota: evite usar nombres de variables de funciones existentes, p. tan.

Nota 2: ¿Está seguro de que no desea que tanto la definición de tan como deltaOfTime esté dentro de la declaración if?

0
mpaskov 7 mar. 2017 a las 18:44