# Point Categorisation via a suggested Mathematica If Statement

1 view (last 30 days)

Show older comments

I've been trying to figure out how to convert this for too long but without success - I'm hoping this is more obvious to a fresh set of eyes. I have a function defined in mathematica:

f=If[-y <= x <= y || y <= -x <= -y, Sign[y], 0]

Which is then applied as:

k_x = A * f;

k_y = A * -f

k_z = 0;

Plotted as a quiver this results in the following on my set of evaluation points (where A is some scalar, =1 for simplicity here):

I know the conditionals need to be seperated out to apply this in MATLAB. My current best attempt is:

N = 3; % Number of equations

nr = length(location.x); % Number of columns

k = zeros(N,nr); % Allocate f

k_x = zeros(1,nr); k_y = zeros(1,nr);

for ind = 1:length(location.x)

if (-location.y(ind) <= location.x(ind) && location.x(ind) <= location.y(ind)) || ...

(location.y(ind) <= -location.x(ind) && -location.x(ind) <= -location.y(ind))

k_x(ind) = sign(location.y(ind));

k_y(ind) = 0;

elseif (location.x(ind) <= -location.y(ind) && -location.y(ind) <= -location.x(ind)) || ...

(-location.x(ind) <= location.y(ind) && location.y(ind) <= location.x(ind))

k_y(ind) = sign(location.x(ind));

k_x(ind) = 0;

else

k_x(ind) = 0;

k_y(ind) = 0;

end

end

k(1,:) = k_x; %kx

k(2,:) = -k_y; %ky

k(3,:) = 0; %kz

figure; quiver3(location.x,location.y,location.z,k(1,:),k(2,:),k(3,:)); hold on;

scatter3(location.x,location.y,location.z,'kx');

This almost works, but the corners don't have the same diagonal as the result I'm expecting from the function (as seen below). The 'diagonal' vectors which I don't achieve in my own function are really important. I also feel like the if loop is probably not the best way to evaluate this function.

An example location structure array is also attached here if testing/applying the code is useful.

Thanks in advance.

##### 3 Comments

Geoff Hayes
on 9 Apr 2020

Edited: Geoff Hayes
on 9 Apr 2020

### Accepted Answer

ADSW121365
on 10 Apr 2020

Edited: ADSW121365
on 14 Apr 2020

##### 4 Comments

Walter Roberson
on 14 Apr 2020

The point is that you wrote,

f_2 = (abs(location.y) <= abs(location.x)).*sign(location.x); %Selects Y Axis Points

which uses sign(x) instead of sign(y) and using sign(x) is not correct according to the Mathematica statement. Using the sign(y) like I did reproduces the Mathematica statement. If the Mathematica is correct, then the code I posted is correct and the code you posted using sign(x) is not correct.

Conversely, if you find that you need sign(x) to get the plot you were interested in, then the implication is that the Mathematica posted is not correct.

### More Answers (1)

Walter Roberson
on 9 Apr 2020

f = (abs(x) <= abs(y)).*sign(y);

Which can be done in vectorized form.

k_x = A*f;

k_y = -k_x;

k_z = zeros(size(k_x));

No loop needed provided that x and y are the same size (such as might be produced by ndgrid or meshgrid)

### See Also

### Community Treasure Hunt

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

Start Hunting!