How to write a simple MATLAB code for simplification of if.. else.. code
    3 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
My program has a vector x=(x1,x2,...xn) and I want to compare xp with the values of the vector x. I wrote the following code in my program. Can we simplify the following code using any matlab builtin functions
if (xp<=x(1)) s=1;
else if xp>=x(n) s=n;
else
    for i=2:n-1
    if xp>=x(i) && xp<x(i+1) s=i;
    end
    end
    end
end
5 commentaires
  Walter Roberson
      
      
 le 14 Sep 2018
				What value is to be selected if xp > x(1) & xp < x(2) ?
Your pseudocode reserves the value 1 for values no greater than x(1), and starts at 2 for values at least as large as x(2), leaving open the question of what should happen for values between the two.
Réponses (3)
  Walter Roberson
      
      
 le 14 Sep 2018
        [~, s] = histc(xp, [-inf x(2:end) inf]);
selected_x = x(s);
This assumes x is in increasing order.
3 commentaires
  Walter Roberson
      
      
 le 14 Sep 2018
				s is exactly the value you calculate in your pseudocode, 1 for values too low, n for values above the range, and so on.
If you are asking about the construct [~,s] then it is the same as if you had coded
[SoMEVarIaBlEiWILLnoTuSE, s] = histc(xp, [-inf x(2:end) inf]);
clear SoMEVarIaBlEiWILLnoTuSE
That is, it says that you want to ignore the output in that position. Like many functions, histc returns multiple outputs that have different purposes; the first output of histc is the bin counts (because histc was primarily intended to aid in computing histograms.)
  Rik
      
      
 le 14 Sep 2018
				A minor edit makes removes the assumption of being ordered.
temp_x=sort(x);
[~, s] = histc(xp, [-inf temp_x(2:end) inf]);
selected_x = temp_x(s);
  Fangjun Jiang
      
      
 le 13 Sep 2018
        
      Modifié(e) : Fangjun Jiang
      
      
 le 13 Sep 2018
  
      x=10:10:100;
xp=29;
n=numel(x);
interp1([-realmax,x,realmax],[1,1:n,n],xp,'previous')
5 commentaires
  Fangjun Jiang
      
      
 le 14 Sep 2018
				x=[-1 -1.2 -1.4 -1.6 -1.8 -2];
xp=[-1.3, -2.5, 1];
n=numel(x);
index=interp1([realmax,x(2:end),-realmax],[1:n,n],xp,'next')
yp=x(index)
x=[1 1.2 1.4 1.6 1.8 2];
xp=[1.3, 2.5, 0.5];
n=numel(x);
index=interp1([-realmax,x(2:end),realmax],[1:n,n],xp,'previous')
yp=x(index)
  Fangjun Jiang
      
      
 le 17 Sep 2018
        
      Modifié(e) : Fangjun Jiang
      
      
 le 17 Sep 2018
  
      Now I think your problem has nothing to do with the increasing or decreasing of the values in x. Rather, it is to lookup and "match" the values in x towards zero, similar to the difference between floor(), ceil() and fix(). To do this, use the 'previous' and 'next' option of interp1() based on the sign of xp value. Please note, you shall add -realmax and realmax to avoid extrapolation, add 0 to avoid nondeterministic when xp fells between two points in x that are on the opposite side of zero.
x=[1 1.2 1.4 1.6 1.8 2 -1 -1.2 -1.4 -1.6 -1.8 -2];
xp=[-1.3, -2.5, -0.5 1 1.3, 2.5, 0.5];
xMod=[x,-realmax,0,realmax];
yp=zeros(size(xp));
for k=1:numel(xp)
    if xp(k)>=0
        yp(k)=interp1(xMod,xMod,xp(k),'previous');
    else
        yp(k)=interp1(xMod,xMod,xp(k),'next');
    end
end
0 commentaires
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!