Point Categorisation via a suggested Mathematica If Statement
조회 수: 1 (최근 30일)
이전 댓글 표시
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):
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/283187/image.png)
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.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/283188/image.png)
An example location structure array is also attached here if testing/applying the code is useful.
Thanks in advance.
댓글 수: 3
Geoff Hayes
2020년 4월 9일
편집: Geoff Hayes
2020년 4월 9일
ADSW121365 - the conditions for the if statement look fine. I just don't understand how the elseif conditions relate to the Mathematica equation that you have shown (which only references Sign[y] and not Sign[x]). And is the data in the mat-file the same data used for the Mathematica plot?
채택된 답변
ADSW121365
2020년 4월 10일
편집: ADSW121365
2020년 4월 14일
댓글 수: 4
Walter Roberson
2020년 4월 14일
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.
추가 답변 (1개)
Walter Roberson
2020년 4월 9일
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)
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!