我试图绘制一个具有数百万个点的函数。因此,不可能绘制该函数,因为它会使我的计算机崩溃。但是,整个图由“肘部”组成,因为一次不能超过1个变量。
考虑以下矩阵
a = [1 2 3 4 4 4 4];
b = [1 1 1 1 2 3 4];
使用plot(a,b)
但是,经过仔细检查,我可以将绘图向量减小到
a = [1 4 4];
b = [1 1 4];
并获得相同的情节。
我的问题是:什么是自动删除每个冗余点的矢量化方法。我可以轻松地遍历并搜索要删除的点,但这会很昂贵。我尝试使用diff
和cumsum
的组合来做到这一点无济于事。我在图中只有直线和直角,因此我不必担心任何ax+b
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:0)
猜猜我会回答我自己的问题,以防其他任何人需要。基本上,我正在做的是在每个矩阵上进行第一个差异,以查看值是否在每个元素之间变化。第二个差异查找更改。因为我们在寻找弯头,所以最终从x轴的true切换到y轴的true。这就是我们要寻找的重点。然后我们在两端添加。从那里开始,我们只保留原始矩阵的真实元素。
mat = [true diff(logical(diff(a))-logical(diff(b))) true];
a(mat)
[1 4 4]
b(mat)
[1 1 4]
我愿意接受其他建议,因为这很hacky。