Octave 满足八度三维图中的一个不等式

Octave 满足八度三维图中的一个不等式,octave,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

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

x=linspace(-2,2,50);
y=linspace(-2,2,50);
[xx,yy]=meshgrid(x,y);
mesh(xx,yy,4-(xx.^2+yy.^2))
是否存在这样一个不等式,即我只在x一个可能的错误:

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=linspace(-2,2,50);
[xx,yy]=meshgrid(x,y);
cond=xx
严格来说,这将把所有不符合标准的坐标对从其当前位置移动到绘图原点:


这与已经提供的另一个答案非常相似,但可能有助于解决您提到的数据中该答案所导致的“奇怪异常”。基本上创建一个掩码,该掩码为
1
,其中
xx
,否则为
0

mask = xx < yy;
只有这样,您才能绘制结果:

mesh(xx_mask, yy_mask, 4-(xx_mask.^2 + yy_mask.^2));
基本上唯一的区别是,通过这种方式,您将
xx
yy
矩阵中不需要的值设置为零,然后再将它们平方并绘制


注意,这是用MATLAB而不是倍频程测试的,但是他们应该给出类似的结果。

只有当点(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=linspace(1,3,50);
y=linspace(1,3,50);
\[xx,yy\]=meshgrid(x,y);
掩码=xx
或者可以做的是保持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));
x=linspace(1,3,50);
y=linspace(1,3,50);
[xx,yy]=meshgrid(x,y);
掩码=xx

此解决方案在所有情况下都有效,无论(0,0)是否属于您的图表

这几乎适用于我的情况,但它在我实际制作的情节中造成了奇怪的偏差。非常接近@mjnichol,这是一个小错误:我错过了
mesh
的最后一个参数中的
cond
。我会修好的,这把事情修好了!谢谢你们引导我找到解决方案!如果我有更高的代表,我会投票支持你们两个@工程师罗,你的答案完全是我的,只是我错过了
mesh
(我的bug)最后一个参数中的掩码。你应该修正我的,而不是自己回答。@juliohm你是对的。我开始尝试做一些完全不同的事情,用
find
,甚至用
sparse
做了一点尝试,但最终还是收敛到了您的解决方案中。我会删除它,因为你肯定先删除了它。编辑:我不能删除。希望OP能看到这一点,并标记你的。
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));