Daha hızlı matlab grafikleri nasıl çizilir?

Mathworks sayfasında araştırma yaparken bu konu oldukça ilgimi çekti. Bize öğretildiği şekliyle gerçek zamanlı ses sinyalini çizdiremiyordum o halde matlab yavaş bir dil diye karar verip Python öğrenmiştim. Ayrıca matlab grafiksel komutları c/c++ dillerine dönüştürememesi beni çaresiz bırakmıştı.
Python ile gerçek zamanlı ses sinyalini matplotlib ile yapmanız oldukça güçtür bende pyqtplot kütüphanesini kullanmaya başlamıştım.
Matlab grafik hızı varsayılan özelliklerinden kaynaklanıyor. Bu özelliker basit kullanımda hayat kurtarıyor ama iş hıza gelince birkaç düzenleme yapmak gerekiyormuş.
not: Kodlar Mathwork sitesindeki örneklerden

<Normal Plot>
[sx,sy,sz] = peaks(500);
nframes = 490;

for t = 1:nframes
surf(sx,sy,sz,'EdgeColor','none')
hold on
plot3(sx(t+10,t),sy(t,t+10),...
sz(t+10,t+10)+0.5,'o',...
'MarkerFaceColor','red',...
'MarkerSize',14)
hold off
drawnow
end
</Normal Plot>
Fark ettiyseniz her seferinde surf ve plot3 fonksiyonlarını çağırıyorsunuz. Her seferinde tüm [sx,sy,sz] verileri 3d olarak hesaplamaları yapılıyor.
Peki birkez dataların konumları verilir ve sadece gerekli dataların değişeceğini söylesem.

<Performans Plot>
[sx,sy,sz] = peaks(500);
nframes = 490;

surf(sx,sy,sz,'EdgeColor','none')
hold on
h = plot3(sx(1,1),sy(1,1),sz(1,1),'o',...
'MarkerFaceColor','red',...
'MarkerSize',14);
hold off

for t = 1:nframes
set(h,'XData',sx(t+10,t),...
'YData',sy(t,t+10),...
'ZData',sz(t+10,t+10)+0.5)
drawnow
end
</Performans Plot>
"set" fonksiyonu belli miktar datayı alır ve grafiğin küçük parçasını güncellersek ve "drawnow" ile güncellemeyi ekrana yansıtırsak hareket eden hızlı çizilen bir grafik oluştuğunu görürüz.
Ama hala yavaş. Peki nasıl hızandırabiliriz? Minecraft, OpenGl yada PCL ile uğraşmışlar bilir. Kameranın dışını hesaplamaya ve render mesafesinden ötesinin dönüşüm hesaplarını yapmak gereksizdir. Yani çanklar yani bölümler halinde çizdirmek.

<Normal Stairs>
% Code with Poor Performance Code with Better Performance
% Grow data
figure('Position',[10,10,1500,400])
n = 5000;


h = stairs(1,1);
ax = gca;
ax.XLim = [1,n];
ax.YLim = [0,1];
ax.ZLim = [0,1];
ax.NextPlot = 'add';

xd = 1:n;
yd = rand(1,n);

tic
for ix = 1:n
set(h,'XData',xd(1:ix),'YData',yd(1:ix));
drawnow;
end
toc
</Normal Stairs>
Başka bir grafik fonksiyonuyla aynı "set" işlemi.

<Performans Stairs>
% Segment data
figure('Position',[10,10,1500,400])
n = 5000;
seg_size = 500;
xd = 1:n;
yd = rand(1,n);

h = stairs(1,1);
ax = gca;
ax.XLim = [1,n];
ax.YLim = [0,1];
ax.ZLim = [0,1];
ax.NextPlot = 'add';

tic
start = 1;
for ix=1:n
% Limit object size
if (ix-start > seg_size)
start = ix-1;
h = stairs(1,1);
end
set(h,'XData',xd(start:ix),...
'YData',yd(start:ix));
% Update display in 50 point chunks
if mod(ix,50) == 0
drawnow;
end
end
toc
</Performans Stairs>
Burada olan şey 500 adet datada bir çanklar yani bölümler halinde çizim yaptırmak. Döngü 5000 kez dönecek ve 50 datada bir grafik görüntü ekranda güncellenecek. "drawnow" olmadan başlarsa grafik canlı görünmez ama "set" grafiği güncellemeye devam eder.

Yorumlar

Popüler Yayınlar