Matlab 删除绘图上的冗余点

Matlab 删除绘图上的冗余点,matlab,Matlab,我试图画一个有数百万个点的函数。因此,无法绘制函数,因为它会使我的计算机崩溃。但是,整个绘图由“弯头”组成,因为一次不能更改1个以上的变量 考虑以下矩阵 a = [1 2 3 4 4 4 4]; b = [1 1 1 1 2 3 4]; 使用绘图(a,b) 然而,经过仔细检查,我可以将我的绘图向量减少到 a = [1 4 4]; b = [1 1 4]; 得到同样的情节 我的问题是:什么是矢量化的方法来自动删除每个冗余点。我可以很容易地循环并搜索要删除的点,但这会很昂贵。我尝试过使用dif

我试图画一个有数百万个点的函数。因此,无法绘制函数,因为它会使我的计算机崩溃。但是,整个绘图由“弯头”组成,因为一次不能更改1个以上的变量

考虑以下矩阵

a = [1 2 3 4 4 4 4];
b = [1 1 1 1 2 3 4];
使用
绘图(a,b)

然而,经过仔细检查,我可以将我的绘图向量减少到

a = [1 4 4];
b = [1 1 4];
得到同样的情节


我的问题是:什么是矢量化的方法来自动删除每个冗余点。我可以很容易地循环并搜索要删除的点,但这会很昂贵。我尝试过使用
diff
cumsum
的组合来实现这一点,但没有效果。我在绘图中只有直线和直角,因此我不必担心ax+b形式的任何问题。我想我会回答我自己的问题,以防其他人需要。基本上,我所做的是对每个矩阵进行第一次微分,看看每个元素之间的值是否在变化。第二个差异寻找变化。因为我们在寻找肘部,我们最终会从x轴上的true切换到y轴上的true。这就是我们要寻找的重点。然后我们加上两端。从那里我们只保留原始矩阵的真实元素

mat = [true diff(logical(diff(a))-logical(diff(b))) true];
a(mat)
[1     4     4]
b(mat)
[1     1     4]
我愿意接受其他的建议,因为这是一个非常粗糙的问题。

你可以使用
diff(diff(a))~=0
,或者等效的
diff(a,2)~=0
,来获得一个看起来更干净的解决方案。无论您是将
a
还是
b
插入
diff
功能,这都会起作用

mat = [true, diff(a, 2)~=0, true];
a(mat)
 ans =
     1     4     4
b(mat)
 ans =
     1     1     4

请出示您的
diff
cumsum
试一试好吗?特别是如果你只有水平线,
diff
应该可以做到。你是对的,但我正在尝试删除多余的水平点和垂直点。实际上,我可能有一个解决方案
[1逻辑(diff(diff(a)-diff(b)))1]
,但我需要检查它。我现在觉得很傻,我正在做的是wtf。这只在直线只能是水平或垂直的情况下起作用,并且只有在水平直线上的点间隔均匀的情况下才起作用。将
a
更改为
a=[12.01 3 4]将停止工作。如果x(或y)位于相同的值之间,可以删除点<代码>具有_diff=diff(a)==0然后
保持点=[true,has diff]&[has diff,true]
。这将删除具有常数
a
的线段上除第一个和最后一个点以外的所有点,并且即使
a
的间距不均匀,也符合您的目的。。。但它仍然必须是单调的沿段。(它将以
a=[0 0];b=[0 9 1];
失败,中心点不应被删除)。