Проверить матричный элемент

Мне нужно (rho,theta) meshgrid, и для этого сначала я определил meshgrid в декартовых координатах, а затем преобразовал его в полярные координаты:

[X,Y] = meshgrid(x,y);
R = sqrt(X.^2+Y.^2);
PHI = atan2(Y,X);

Теперь я получаю сетку в полярных координатах, но поскольку это квадратная сетка, я получаю вот это.

введите здесь описание изображения

Я говорю, что значения больше R неверны и поэтому устанавливаю их равными нулю. Я сделал это таким образом

for i = 1:1:length(R)
    for j = 1:1:length(R)
        if R(i,j) > a
            R(i,j) = 0;
        else
            R(i,j);
        end
    end
end

Как я могу сделать это менее запутанным?


person Shika93    schedule 19.11.2018    source источник


Ответы (2)


Для прямого преобразования декартовых координат в полярные: используйте cart2pol.

[theta,rho] = cart2pol(x,y)

Тогда подойдет простая логическая проверка:

tmp = rho>R;
rho(tmp)=0; %=[] to delete completely
theta(tmp)=0;

Для чего это стоит: вы, конечно, можете создать прямую полярную сетку:

[theta,rho] = meshgrid(0:dtheta:theta,0:dR:R)

Наконец: i и j обозначают воображаемую единицу в MATLAB, и я бы возражал против использования их в качестве обычных переменных по указанным причинам. в этом посте, но это мое мнение.

person Adriaan    schedule 19.11.2018
comment
Я думал создать полярную сетку напрямую, но у меня возникли проблемы с построением результатов с использованием quiver из-за разного размера матриц theta и rho. С решением, которое я выбираю (снова декартово-полярно-декартово), у меня есть квадратная сетка, которой легче управлять - person Shika93; 20.11.2018
comment
@ Shika93 Shika93, вы могли бы просто сделать свои векторы theta и rho, которые вы передаете meshgrid, одинаковой длины, и тогда quiver с этим все в порядке. В любом случае, cart2pol делает в основном то же самое, что и вручную, просто завернутый в удобную функцию. - person Adriaan; 20.11.2018

Если мы говорим, что a — это предел, который вы хотите использовать, вы можете использовать приведенный ниже код вместо цикла for:

R = (R<=a).*R

Или вы также можете использовать:

R(R>a) = 0
person Cedric Zoppolo    schedule 19.11.2018
comment
Просто обратите внимание, что в вашем коде вы использовали R для обозначения радиуса и a для обозначения предела. Принимая во внимание, что на рисунке вы используете R в качестве предела и rho для радиуса. Я использовал обозначение, которое вы указали в своем коде. - person Cedric Zoppolo; 20.11.2018
comment
Мне нравится второй вариант. О да, я не следовал обозначениям, которые использовал в своем коде внутри изображения, извините. Это было просто, чтобы уточнить, что мне нужно. Спасибо - person Shika93; 20.11.2018