MATLAB中的分段常数曲面

时间:2014-11-18 02:56:48

标签: matlab

我想生成一个分段的常量曲面,它在某个矩形之外为零。更具体地说,对于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;

感谢您的帮助,如果您希望我更清楚地说明我想要的功能,请告诉我。

2 个答案:

答案 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

上面的代码分配了一个零矩阵,然后开始遍历分段定义的每个部分,并搜索满足特定感兴趣范围的xy值。然后,它将Z的输出设置为f(t)的输出给出这些约束。请注意,已经通过将整个矩阵设置为零来处理其他条件。然后我使用mesh来显示曲面,然后调整绘图的方位角和仰角以获得更好的视图。具体来说,我将它们分别设置为-60度和20度。另请注意,我将x值的分辨率降低到步长为0.1而不是0.01,以获得更少的粒度。这完全是为了让您更好地看到mesh

这是我得到的图表:

enter image description here

答案 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将被修改为您想要的值。