Loop to Identify changes/steps for each column of a matrix
    8 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    Simone A.
 am 17 Jan. 2023
  
    
    
    
    
    Bearbeitet: Jan
      
      
 am 7 Mär. 2023
            Dear all,
I've got a matrix, let's call it M. 
What I need to do, is to identify all of the values, for each column, that are both less than the maximum seen so far and follow a linear pattern.
Someone kindly helped me to write a code to address the first task (i.e., identify values less than the maximum seen so far), but I still need to meet the second condition, as I didn't realise that the second condition would have occurred in my dataset:
nrows = height(M);
Mx = zeros(size(M));
runningmax = M(1,:);
for nr = 2:nrows
    oldrunningmax = runningmax;
    runningmax = min(runningmax, M(nr, :));
    Mx(nr,:) = M(nr,:) > runningmax | M(nr, :) == oldrunningmax;
end
Mx
Now, the code above correctly identifies all of the values less than the maximum seen so far (red circles in the figure below):

However, I also need to identify the values that deviate from a linear pattern, such as the major steps in the figure below: 

I have attached a data sample (M), which is a portion of a column of my matrix (the one in the figure above). 
Could you please help me to amend the code above to correctly meet both conditions?
Thanks a lot!
2 Kommentare
  Jan
      
      
 am 17 Jan. 2023
				Do I understand correctly, that the part until "However, I also need" has no relation to the current question? Unrelated information reduce the chance to get a useful answer.
I assume the first part can be simplified using: M < cummax(M, 1) . No loop is required.
Akzeptierte Antwort
  Vinayak Gupta
    
 am 7 Mär. 2023
        Hi Simone,
I went through your last question and the file that you shared. The first problem is to identify values that are less than the current maximum in each column. As suggested by Jan, it can be efficiently calculated using cummax.
The example from your previous question:
M = [ ...
1.05  21.22  17.2; ...
2.01  22.35  18.2; ...
3.52  23.63  19.2; ...
4.32  23.54  20.2; ...
5.11  23.56  18.2; ...
6.89  23.64  19.2; ...
7.01  23.65  20.3; ...
8.87  23.99  21.3; ...
6.52  24.52  22.3; ...
7.91  24.51  23.3; ...
8.42  24.515  24.3; ...
9.03  24.525  22.3; ...
10.88  25.23  24.4; ...
11.01  45.12  25.4; ...
11.32  48.13  24.4; ...
11.33  46.14  26.4; ...
12.12  46.15  31.1; ...
12.09  48.142  32.2; ...
12.11  48.143  30.02; ...
12.13  48.151  31.6; ...
12.52  48.36  33.1];
Mx = M < cummax(M,1)
The second problem is to identify points where data deviates from a linear pattern. This is a basic problem of second order derivatives. You can read about calculating derivatives here.
Mdotdot = diff(M,2);
As you might notice, there are a lot of concerned points, we might reduce them by adding some tolerance or using regressions. That will depend upon your problem statement.
I have calculated major points by keeping tolerance of 0.0001 for a small dataset.
sample = [46.4317555606203;
46.4293527462125;
46.4269518155469;
46.4245509077724;
46.4221499999979;
46.4197490922233;
46.4193745945352;
46.4190278418127;
46.4186810890903;
46.4183343363678;
46.4159619684783;
46.4135587379910;
46.4111555075037;
46.4087522770164;
46.4063485181607;
46.4039447504363;
46.4015409827118;
46.3991372149874;
46.3967358074631;
46.3943344432232;
46.3919330789833];
tol = 0.0001;
plot(abs(diff(sample,2)) > tol)
0 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
				Mehr zu Logical finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



