2015-06-02 2 views
2

Я хочу иметь дело с 3d структурами в MATLAB. Я новичок в MATLAB, и я не видел ответа на этот вопрос после его поиска.Можете ли вы определить переменную в MATLAB как набор?

Если вы хотите явно определить конкретную сферу, не используя встроенную функцию сферы, как это будет работать? Например, существует ли способ, которым вы могли бы определить переменную r = (1,1,1) в xyz-системе координат, а затем определить новую переменную/set S = {all s: distance (r, s) < = радиус)}. Было бы очень удобно, если бы я мог это сделать, но я не уверен, как MATLAB может справиться с чем-то подобным, поскольку это будет включать бесконечный набор точек, поэтому MATLAB должен будет иметь определенное определенное максимальное разрешение. Это возможно? Было бы здорово, если бы можно было определить 3d-структуры таким образом. Спасибо

ответ

0

Вы можете использовать код вроде следующего:

r=1; 
resolutionPhi=50; 
resolutionTheta=60; 
phi=linspace(0,pi,resolutionPhi); %linspace gives (50) equally spaced points between (0) and (pi) 
theta=linspace(0,2*pi,resolutionTheta); 
[phi,theta]=meshgrid(phi,theta); %meshgrid replicates the vectors into a rectangular array 

x=r*sin(phi).*cos(theta); 
y=r*sin(phi).*sin(theta); 
z=r*cos(phi); 

Вы можете настроить разрешение путем изменения переменных разрешения.

+0

Спасибо, это полезно – Franz

2

Если к

все с: расстояние (R, S) < = радиус)

вы имеете в виду

Все S в R: расстояние (r, s) < = радиус)

тогда ответ:

  • Нет, вы не можете определить, что набор by extension (то есть, перечислив все его элементы), так как набор uncountably infinitely many elements.

  • Но вы можете определить, что набор Sby intension. Это означает, что вы можете построить правила (функцию), что при любом значении х в R , скажете вам, если х в S или нет.

А именно, это правило может быть построен с использованием anonymous function следующим образом:

>> r = [1 1 1]; %// set center 
>> radius = 2; %// set radius 
>> inS = @(s) sqrt(sum((s-r).^2))<radius; 

Функция inS возвращает true (1) тогда и только тогда, когда ее вход принадлежит S и false (0) в противном случае. Например,

>> inS([0 0 0]) 
ans = 
    1 
>> inS([3 4 5]) 
ans = 
    0 
>> inS([pi sqrt(2) exp(-1)]) 
ans = 
    0 

Возможно, это самый близкий путь к определению этого набора.

Если вы хотите проверить несколько значений сразу, вместо того, чтобы с помощью цикла вы можете vectorize the function с bsxfun:

>> inS = @(s) sqrt(sum((bsxfun(@minus, s, r)).^2, 2))<radius; 
>> points = [ 0 0 0 
       3 4 5 
       pi sqrt(2) exp(-1) ]; 
>> inS(points) 
ans = 
    1 
    0 
    0 
+0

Спасибо! Отличный пример, это именно то, что я имел в виду. Я так понимаю, вы могли бы написать цикл, который мог бы работать через все 3d-координаты, как сетка с произвольным разрешением, и назначать значения для приближения формы 3D-объекта, как вы говорите. – Franz

+0

Да, вы могли бы использовать цикл. Но лучше векторизовать функцию, так что она принимает все значения сразу. См. Edit –

+0

Хороший ответ! Но я думаю, что это называется «несчетно бесконечно много элементов». –

Смежные вопросы