Edit: Updated the code to include the lines required to plot the quiver plot.

# 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

### Accepted Answer

### 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

### Categories

### Community Treasure Hunt

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

Start Hunting!