Matlab slows downs within certain loop

In my code I have the following loop where running my code slows down:
for i = 1:c_max
c_n = cm(i,:);
x = c{i}(:,1);
y = c{i}(:,2);
z = c{i}(:,3);
markersize = c{i}(:,4);
for j = 1:size(c{i}(:,1),1)
splot = scatter3(x(j),y(j), z(j),markersize(j), c_n);
drawnow limitrate
end
end
I know that when using "drawnow" it makes the simulation slower. However, when I'm not using it, somehow my plot and matlab do not respond anymore after the plot is shown and I have to restart matlab again. I'm also unable to save the plot because matlab does not respond anymore. Does any one have suggestions on how to make it faster and/or not make matlab unresponsive? In this case, I'm using 250k data points within each column matrix 'c' and the maximum value for 'c_max' is 25.

13 件のコメント

Adam Danz
Adam Danz 2019 年 5 月 13 日
I formatted your code. In the future, please use the code format button when you provide code.
Stephen23
Stephen23 2019 年 5 月 13 日
"Does any one have suggestions on how to make it faster and/or not make matlab unresponsive?"
Update the line/patch/... data, rather than calling plot/scatter/... on every iteration.
Adam Danz
Adam Danz 2019 年 5 月 13 日
編集済み: Adam Danz 2019 年 5 月 13 日
My guess is that your i and j loops are very long and the reason matlab isn't responding is because the data and figure are still being processed. If you don't use drawnow, you won't see the results until the execution is complete.
mootje_3000
mootje_3000 2019 年 5 月 13 日
編集済み: mootje_3000 2019 年 5 月 13 日
i has a 25 loops that contain in total 250k data points, these are my j values (loops in this case). So lets say that for every i, j=10,000.
Adam Danz
Adam Danz 2019 年 5 月 13 日
If you're not using splot (output to scatter3), just remove that. It might help a tad.
mootje_3000
mootje_3000 2019 年 5 月 13 日
Done! Using patch or fill3 command leaves the plot empty....?
Adam Danz
Adam Danz 2019 年 5 月 13 日
I assume somewhere in the code prior to the i-loop you are using hold on to make sure that you are not overwriting the axes on each loop, right?
mootje_3000
mootje_3000 2019 年 5 月 13 日
Yes!! That's true! What do I have to do with it? I'm adding some minor text labels to the plot afterwards.
Adam Danz
Adam Danz 2019 年 5 月 13 日
"hold on" prevents the axes from clearning when you add more objects to the plot.
Walter Roberson
Walter Roberson 2019 年 5 月 13 日
Do you need to see the display evolve or is that more to check that work is proceeding properly?
All of those graphics objects together is inefficient. You could use one total graphics object or slightly easier one per i value, if you update the xdata ydata and size data properties instead of creating all those objects
Adam Danz
Adam Danz 2019 年 5 月 13 日
Note that you'll also need to update the markersize and color values along with the X/Y/ZData values. Fortunately scatter3() allows vectors as size inputs and matrices as color inputs where you can specify the size and color of each (x,y,z) coordinate.
What is stored in each C{i} element? Is it a vector? A matrix? Are they all the same size? If the answer to those questions are 'yes', I have an obvious solution to speed things up.
Walter Roberson
Walter Roberson 2019 年 5 月 13 日
I noticed that all items in the same i use the same color. If one scatter() object were to be used per i then the color data could be left as a 1 x 3 vector instead of having to be repmat() of that to the number of rows equal to the current number of objects.
The user has indicated that c is max 25 elements, and that each element is a matrix of up to 250k rows.
There are ways to paint all of this in bulk, but with the drawnow in there, I have to suspect that they want to view the simulation evolve.
mootje_3000
mootje_3000 2019 年 5 月 13 日
編集済み: mootje_3000 2019 年 5 月 13 日
@WalterRoberson I do not need to see the display evolve, but as i explained earlier, this is the only way for matlab not to get stuck after to simulation and I'm able to save my plot.
@AdamDanz c contains groups that belong together. These groups have a different size. In order to identify these groups in the plot, I need to give them a different color. But also the size of the object within a group are not similar, that's why the size also needs to be different for every object.
@WalterRoberson c is indeed max 25 elements, but these 25 elements have together a total value of 250k data points, which varies per element. Drawing it in bulk will somehow get matlab to be unresponsive.....?

サインインしてコメントする。

 採用された回答

Walter Roberson
Walter Roberson 2019 年 5 月 13 日

0 投票

for i = 1:c_max
c_n = cm(i,:);
x = c{i}(:,1);
y = c{i}(:,2);
z = c{i}(:,3);
markersize = c{i}(:,4);
scatter3(x(:), y(:), z(:), markersize(:), c_n);
drawnow limitrate
end

2 件のコメント

Walter Roberson
Walter Roberson 2019 年 5 月 14 日
And if you need to, then
batchsize = 5000;
batchoff = 0:batchsize-1;
for i = 1:c_max
c_n = cm(i,:);
x = c{i}(:,1);
y = c{i}(:,2);
z = c{i}(:,3);
markersize = c{i}(:,4);
%ending with the last full batch and then doing the partial batch
%saves having to keep testing if we have reached the end of the data
for j = 1 : batchsize : size(c{i}(:,1),1) - batchsize + 1
scatter3(x(j+batchoff), y(j+batchoff), z(j+batchoff),markersize(j+batchoff), c_n);
drawnow limitrate
end
scatter3(x(j+batchsize:end), y(j+batchsize:end), z(j+batchsize:end), markersize(j+batchsize:end), c_n);
drawnow limitrate
end
mootje_3000
mootje_3000 2019 年 5 月 14 日
Thanks a lot, works like a charm! @AdamDanz also thanks for your help!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeGraphics Performance についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by