我希望能够在MATLAB中处理3d结构。我是MATLAB的新手,在谷歌搜索后我还没有看到这个问题的答案。
如果要显式定义特定球体,而不使用内置球体功能,这将如何工作?例如,有没有办法可以在xyz坐标系中定义变量r =(1,1,1),然后定义一个新的变量/集S = {all s:distance(r,s)< =半径)}。如果我能做到这一点会非常方便,但我不确定MATLAB如何处理类似的东西,因为它涉及无限的一组点,所以MATLAB必须有一些定义的最大分辨率。这可能吗?能够以这种方式定义3d结构会很棒。谢谢
答案 0 :(得分:2)
如果通过
你的意思是所有s:距离(r,s)< = radius)
然后答案是:所有s 在R 3 :距离(r,s)< = radius)
不,您无法定义该集by extension(即枚举其所有元素),因为该集合具有uncountably infinitely many elements。
但您可以定义该集 S by intension。这意味着你可以构建一个规则(一个函数),在R 3 中给出任何值 x ,它会告诉你是否 x 是否在 S 中。
即,可以使用anonymous function构建该规则,如下所示:
>> r = [1 1 1]; %// set center
>> radius = 2; %// set radius
>> inS = @(s) sqrt(sum((s-r).^2))<radius;
当且仅当其输入属于 S 和inS
({{1}时,函数true
才会返回1
(false
) }}) 除此以外。例如,
0
这可能是你最接近“定义”那套的。
如果您想一次测试多个值,而不是使用循环,您可vectorize the function使用bsxfun
:
>> inS([0 0 0])
ans =
1
>> inS([3 4 5])
ans =
0
>> inS([pi sqrt(2) exp(-1)])
ans =
0
答案 1 :(得分: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);
您可以通过更改分辨率变量来调整分辨率。