MATLAB: How to create new variables from a range in a matrix based on values

loopsmatrix manipulationvariables

Hello –
I am fairly new to MATLAB and struggling with a question and not sure where to begin, so I apologize for not having sample code here to start with.
There is a 7524 x 3 matrix m file attached which has columns of: 1) MATLAB date; 2) an asset value; and 3) an asset drawdown stream. Each row is a trading day.
I am trying to do the following:
Loop through each row and find ranges of values between zeros in column 3, given a certain threshold. For example, if the threshold is -.05, I would like to find and assign a variable to this range between zeros (new highs for the asset in column 3). If, between zeros (new highs), there is not a value <= -.05, disregard and move to the next. I would like to assign a unique variable name for all instances that meet this criteria (i.e. instance 1, instance 2, etc…) and then save to disk.
I am struggling thinking through how to accomplish this, so any help would be very appreciated!
Please let me know if further clarification is needed.

Best Answer

I am not certain what you want.
Try this:
D = load('spxDrwDwnData.mat');
A = D.spxDrwDwnData;
Thr = -0.05; % Threshold Value
Lv = A(:,3) <= Thr; % Logical Vecttor
TranPos = strfind(Lv.', [0 1])+1; % Transition From Logical 0 To Logical 1
TranNeg = strfind(Lv.', [1 0])+1; % Transition From Logical 1 To Logical 0
for k = 1:numel(TranPos)
Vct{k} = A(TranPos(k):TranNeg(k),1); % Dates Corresponding To Regions Between Zeros
Instance{k} = k*ones(TranNeg(k) - TranPos(k) + 1, 1); % Instance Numbers
end
figure
plot(A(:,1), A(:,3)) % Plot Data
hold on
plot(A(TranPos,1), A(TranPos,3), '+g')
plot(A(TranNeg,1), A(TranNeg,3), '+r')
for k = 1:numel(Vct)
plot(Vct{k}, -Instance{k}*0.01, 'LineWidth',2) % Plot ‘Instance’ Vectors
end
hold off
grid
axis([726790 727200 -0.1 0]) % Zoom For Detail (Optional)
The plot is a graphic depiction of what the code does, with the data yoou provided. See if the ‘Instance’ numbers do what you want them to do.