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

1 view (last 30 days)

Show older comments

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')

##### 1 Comment

KSSV
on 28 Sep 2016

### Accepted Answer

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;

##### 0 Comments

### More Answers (1)

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!