# How to use if, if I want to locate something in a matrix

1 view (last 30 days)
Eric Daiber on 27 Sep 2016
Answered: Eric Daiber on 29 Sep 2016
I am trying to model a streamline with a pumping well. I have an equation describing the position of the streamline, however, the analytical solution fails at the well location. What I want is to locate the cells that misbehave in matrix U, which equal (xi+or-2) and (yi+or-2) and make them equal to xi and yi. I tried if (..) function but I havent been successful. Any aid is appreciated. Thanks, Eric
theta = 135; %degrees
Q = 10000; %ft^3/day
xi = 10; %Well X Position
yi = -10;%Well Y position
q = 1.5
B= 300
Psi = @(m,d) q*sin(theta)*m - q*cos(theta)*d - Q./(2*pi*B)*atan(((m-xi)./(d-yi))); %
D = []; %matrix to contain results from Psi(x,y)
m = 9;%starting x position of particle
d = -9;%starting y position of particle
E= Psi(m,d); %evaluation of Psi for initial position
D = [D;E,m,d];%store Psi in D
%Psi2 equation used in the fzero equation
Psi2 = @(x,y) q*sin(theta)*x - q*cos(theta)*y - Q./(2*pi*B)*atan(((x-xi)./(y-yi))) - D(1,1);% where D(1,1) is the initial Psi value obtained from above.
U = [];%matrix created to contain results of fzero(Psi2).
for y = (d-25):(abs(d)+25); %Y values of particles
x0 = [-5000 5000]; %initial guess for fzero
[x1]= fzero(@(x) Psi2(x,y),x0); %fzero calculation
U=[U;x1, y];
end
% if U(:,1) == (xi-2) && U(:,2) == (yi-2)
% U(:,1) = xi
% elseif U(:,1)>x1;
% x1=x1;
% else U(:,1)<x1;
% x1=x1;
% end
plot(U(:,1), U(:,2), 'k')
xlabel 'x (ft)'
ylabel 'y (ft)'
hold on
plot (xi, yi,'r X')
plot (m,d,'g O')
KSSV on 28 Sep 2016
Plot gives a straight line with a kink close to xi,yi...you want to remove that kink.Is it? Can you be bit more clear about the task.

Mudambi Srivatsa on 29 Sep 2016
I understand that you want to use "if" to find the cells that misbehave in matrix U which equal (xi+or-2) and (yi+or-2) and replace them with 'xi' and 'yi' respectively. The issue is because of the '&&' operator that works for scalar arguments. The operations U(:,1) == (xi-2) and U(:,2) == (yi-2) will each result in a vector and you cannot use '&&' operator. So, you should use '&' operator that works for vector operands.
It is not clear what you exactly meant by (xi+or-2). I am assuming (xi+or-2) means either xi+2 or xi-2 but not the range [xi-2 xi+2] from the commented code. The following code should work for replacing the values with 'xi', 'yi' when matrix values are (xi+or-2) and (yi+or-2).
% find indices where x and y elements are both (+or-2)
ind = (abs(U(:,1) - xi) == 2) & (abs(U(:,2) - yi) == 2)
% replace matching x elements with new value
U(ind,1) = xi;
% replace matching y elements with new value
U(ind,2) = yi;
If (xi+or-2) meant the range [xi-2 xi+2], you can modify the code as follows:
% find indices where x and y elements are both (+or-2)
ind = (abs(U(:,1) - xi) <= 2) & (abs(U(:,2) - yi) <= 2)
% replace matching x elements with new value
U(ind,1) = xi;
% replace matching y elements with new value
U(ind,2) = yi;

Eric Daiber on 29 Sep 2016
Thanks, I used the following code where z = U. Where if the inverse slope increased over 10, I truncated the remaining values.
for i = 2:(numel(z)/2);
if abs((z(i,1)-z(i-1,1))/(z(i,2)-z(i-1,2))) > 10 ;
z(i:(numel(z)/2),1) = z(i-1,1);
z(i:(numel(z)/2),2) = z(i-1,2);
break
end
end