满足Octave 3D图中的不等式

时间:2014-07-09 19:59:59

标签: octave

假设我按以下方式生成一个图:

x=linspace(-2,2,50);
y=linspace(-2,2,50);
[xx,yy]=meshgrid(x,y);
mesh(xx,yy,4-(xx.^2+yy.^2))

无论如何都要施加不等式,以便我只绘制x< Y'

3 个答案:

答案 0 :(得分:1)

一种可能的黑客攻击:

x = y = linspace(-2, 2, 50);
[xx, yy] = meshgrid(x, y);
cond = xx < yy;
xx = xx .* cond;
yy = yy .* cond;
mesh(xx, yy, 4-(xx.^2+yy.^2));

严格地说,这将移动所有不符合标准(x,y)的坐标对x < y从当前位置到地块的原点:

enter image description here

答案 1 :(得分:0)

这与已经提供的另一个答案非常相似,但可能有助于解决奇怪的异常问题。你提到你的数据引起的答案。基本上创建1 xx < yy的掩码,否则0

mask = xx < yy;

然后将此蒙版应用于xxyy网格:

xx_mask = xx.*mask;
yy_mask = yy.*mask;

只有这样才能绘制结果:

mesh(xx_mask, yy_mask, 4-(xx_mask.^2 + yy_mask.^2));

基本上唯一的区别是,这样您就可以将xxyy矩阵中的不需要的值设置为零,然后再对它们进行平方并绘制它们。

enter image description here

注意,这是用MATLAB而不是Octave测试的,但它们应该给出类似的结果。

答案 2 :(得分:0)

如果点(0,0)是图表的一部分,则上述解决方案才有用。否则它将点添加到图表然后尝试绘制,创建奇怪的效果,如下所示。

[![x=linspace(1,3,50);
y=linspace(1,3,50);
\[xx,yy\]=meshgrid(x,y);
mask = xx < yy;
xx_mask = xx.*mask;
yy_mask = yy.*mask;
mesh(xx_mask, yy_mask, 4-(xx_mask.^2 + yy_mask.^2));][1]][1]

可替代地做的是将x和y轴保持原样,并且仅在不满足条件的范围内将z轴值转换为NA。

x=linspace(1,3,50);
y=linspace(1,3,50);
[xx,yy]=meshgrid(x,y);
mask = xx < yy;

function result = applyCondition(cond)
  result = ifelse(cond, 0, NA);
endfunction

zz = 4-(xx.^2 + yy.^2);
mesh(xx, yy, zz + arrayfun(@applyCondition, mask));

此解决方案适用于所有情况,无论(0,0)是否为您的图表的一部分。