if... then... else?

8 visualizaciones (últimos 30 días)
Pieter
Pieter el 11 de Abr. de 2011
Hello,
I have the following problem:
  • Assume a dataset [3000,1]
  • We construct a variable ‘signal’, which will have the same size of our dataset. ‘signal’ will be either 1 or -1, based on the evolution of our dataset.
  • At the starting point (1, 1), ‘signal’ will have the value 1. We keep this value until the dataset moves x % below its highest value during the time that ‘signal’ was equal to 1. From that moment on, the variable ‘signal’ will have the value -1.
  • We keep this value until the dataset moves x % above its lowest value during the time that signal was equal to -1. From that moment on, the variable ‘signal’ will have the value 1 again.
  • And so on, and so on...
  • A short example may make my problem more clear:
x = 10%
  • dataset / signal
  • 97 / 1
  • 100 / 1
  • 93 / 1
  • 89 / -1 / dataset moves x % below its highest value (100) during the '1' signal
  • 86 / -1
  • 80 / -1
  • 93 / 1 / dataset moves x % above its lowest value (80) during the '-1' signal
  • 94 / 1
  • 95 / 1
  • 92 / 1
  • 80 -1 / dataset moves x % below its highest value (95) during the '1' signal
  • … …
Can anybody help me with this issue?
Thanks
Pieter
  1 comentario
Walter Roberson
Walter Roberson el 11 de Abr. de 2011
I'm pretty sure you'll find an old cssm thread with exactly the same problem; see http://www.mathworks.com/matlabcentral/newsreader/

Iniciar sesión para comentar.

Respuesta aceptada

Oleg Komarov
Oleg Komarov el 11 de Abr. de 2011
Try this solution:
A = [97 100 93 89 86 80 93 94 95 92 80];
% Preallocate
Out = ones(size(A));
% First element is momentarily the maximum
maxA = A(1);
% Positive sequence
pos = true;
% Tolerance of 10%
x = .1;
% Start from the second element (since the first is considered the max)
for ii = 2:numel(A)
% 1
if pos
% If new maximum
if A(ii) > maxA
maxA = A(ii);
% If threshold is broken downwards
elseif A(ii)/maxA-1 < -x
minA = A(ii);
Out(ii) = -1;
pos = false;
end
% -1
else
Out(ii) = -1;
% If new minimum
if A(ii) < minA
minA = A(ii);
% If threshold is broken upwards
elseif A(ii)/minA-1 > x
maxA = A(ii);
Out(ii) = 1;
pos = true;
end
end
end
  1 comentario
Pieter
Pieter el 11 de Abr. de 2011
Thank you very much!
Exactly where I was looking for!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Shifting and Sorting Matrices en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by