我想生成一个分段的常量曲面,它在某个矩形之外为零。更具体地说,对于R ^ 2中的t =(x,y),我想要
f(t) = 1 when 5<y<10 and 0<x<1;
-1 when 0<y<5 and 0<x<1;
1 when -5<y<0 and 0<x<1;
0 elsewhere
但是,我得到的表面看起来并不像我想要的那样。我有点像Matlab新手,所以我怀疑问题出在逻辑运算符中。我的代码是:
x = -2:.01:2; y = -15:15
[X,Y] = meshgrid(x,y); %Make domain
for i = 1:numel(X) %Piecewise function
for j = 1:numel(Y)
if Y(j) >= 0 && Y(j)<= 5 && X(i)>=0 && X(i)<=1
h2(i,j)= -1;
elseif Y(j)>5 && Y(j) <= 10 &&X(i)>=0 &&X(i)<=1
h2(i,j) = 1;
elseif Y(j)<0 && Y(j)>=-5 &&X(i)>=0 &&X(i)<=1
h2(i,j) = 1;
elseif X(i) <0 || X(i)>1 || Y(j)<-5 || Y(j)>10
h2(i,j) = 0;
end
end
end
%Normalize
C = trapz(abs(h2));
c = trapz(C);
h2 = c^(-1)*h2;
感谢您的帮助,如果您希望我更清楚地说明我想要的功能,请告诉我。
答案 0 :(得分:1)
您可以使用逻辑运算符组合轻松实现所需的矢量化。避免使用for
循环来做这样的事情。像以前一样定义meshgrid
,但是分配一个零矩阵,然后只在meshgrid
内设置满足要求f(t)
输出值的要求的值。换句话说,这样做:
%// Your code
x = -2:0.1:2; y = -15:15;
[X,Y] = meshgrid(x,y); %Make domain
%// New code
Z = zeros(size(X));
Z(Y > 5 & Y < 10 & X > 0 & X < 1) = 1;
Z(Y > 0 & Y < 5 & X > 0 & X < 1) = -1;
Z(Y > -5 & Y < 0 & X > 0 & X < 1) = 1;
mesh(X,Y,Z);
view(-60,20); %// Adjust for better angle
上面的代码分配了一个零矩阵,然后开始遍历分段定义的每个部分,并搜索满足特定感兴趣范围的x
和y
值。然后,它将Z
的输出设置为f(t)
的输出给出这些约束。请注意,已经通过将整个矩阵设置为零来处理其他条件。然后我使用mesh
来显示曲面,然后调整绘图的方位角和仰角以获得更好的视图。具体来说,我将它们分别设置为-60度和20度。另请注意,我将x
值的分辨率降低到步长为0.1而不是0.01,以获得更少的粒度。这完全是为了让您更好地看到mesh
。
这是我得到的图表:
答案 1 :(得分:0)
您可以使用逻辑索引:
x = -2:.01:2; y = -15:15;
[X,Y] = meshgrid(x,y); %// Make domain
h2=zeros(size(X));
h2(5<Y & Y<10 & 0<X & X<1)=1;
h2(0<Y & Y<5 & 0<X & X<1)=-1;
h2(-5<Y & Y<0 & 0<X & X<1)=1;
该陈述:5<Y & Y<10 & 0<X & X<1
返回1和0的矩阵,其中1表示满足所有4个不等式,0表示至少1个不等式。如果该矩阵有一个,h2
将被修改为您想要的值。