Пробовали ли вы тривиальное решение изменить метод рендеринга на OpenGL
?
opengl hardware;
set(gcf,'Renderer','OpenGL');
Внимание!В этом режиме будут некоторые вещи, которые исчезнут, и он будет выглядеть несколько иначе, но обычно графики будут работать на намного быстрее, особенно если у вас есть аппаратный ускоритель.
КстатиВы уверены, что на самом деле вы получите увеличение производительности?Например, по моему опыту, WPF
графика в C#
значительно медленнее, чем Matlabs, особенно точечные диаграммы и круги.
Edit : я думал о том, что числоточки, которые на самом деле нарисованы на экране, не могут быть такими большими.В основном это означает, что вам нужно интерполировать в местах, где есть пиксель на экране.Проверьте этот объект:
classdef InterpolatedPlot < handle
properties(Access=private)
hPlot;
end
methods(Access=public)
function this = InterpolatedPlot(x,y,varargin)
this.hPlot = plot(0,0,varargin{:});
this.setXY(x,y);
end
end
methods
function setXY(this,x,y)
parent = get(this.hPlot,'Parent');
set(parent,'Units','Pixels')
sz = get(parent,'Position');
width = sz(3); %Actual width in pixels
subSampleX = linspace(min(x(:)),max(x(:)),width);
subSampleY = interp1(x,y,subSampleX);
set(this.hPlot,'XData',subSampleX,'YData',subSampleY);
end
end
end
И вот пример, как его использовать:
function TestALotOfPoints()
x = rand(10000,1);
y = rand(10000,1);
ip = InterpolatedPlot(x,y,'color','r','LineWidth',2);
end
Еще одно возможное улучшение: Кроме того, если вашx данные отсортированы, вы можете использовать interp1q
вместо interp
, что будет намного быстрее.
classdef InterpolatedPlot < handle
properties(Access=private)
hPlot;
end
% properties(Access=public)
% XData;
% YData;
% end
methods(Access=public)
function this = InterpolatedPlot(x,y,varargin)
this.hPlot = plot(0,0,varargin{:});
this.setXY(x,y);
% this.XData = x;
% this.YData = y;
end
end
methods
function setXY(this,x,y)
parent = get(this.hPlot,'Parent');
set(parent,'Units','Pixels')
sz = get(parent,'Position');
width = sz(3); %Actual width in pixels
subSampleX = linspace(min(x(:)),max(x(:)),width);
subSampleY = interp1q(x,y,transpose(subSampleX));
set(this.hPlot,'XData',subSampleX,'YData',subSampleY);
end
end
end
И вариант использования:
function TestALotOfPoints()
x = rand(10000,1);
y = rand(10000,1);
x = sort(x);
ip = InterpolatedPlot(x,y,'color','r','LineWidth',2);
end