更新绘图数据的有效方法
Efficient way to update plot data
我想提高应用程序设计器中 GUI 的效率,即使它涉及一次前端加载图形生成,以节省后续 views/updates 的时间。
我正在尝试更新一个 UIAxes,其中包括 4 个 patch() 句柄和大约 10 个引用大约 30 行的 plot3() 句柄。目标是生成图形,然后能够更新超过 120 个不同时间点的所有数据的位置。 ("Play"通过结果)
问题是更新一次图形大约需要1.5秒。更新 patch() 句柄大约比 plot3() 句柄快一个数量级。虽然我的代码不需要立即 运行,但我希望它可以更新得更快(每个时间点 < 0.5 秒)。
我正在使用以下语法更新(作为示例)我的 plot3 句柄之一,其中包括 3 个不同的线对象(因此引用 {'XData'} 的单元格):
set(p1.foo1,{'XData'},num2cell([foo1.fem.nds(:,1,1) foo1.tib.nds(:,1,1)],2));
set(p1.foo1,{'YData'},num2cell([foo1.fem.nds(:,2,1) foo1.tib.nds(:,2,1)],2));
set(p1.foo1,{'ZData'},num2cell([foo1.fem.nds(:,3,1) foo1.tib.nds(:,3,1)],2));
运行 这大约需要 0.3 秒,并且只是 5 个 plot3 句柄中的 1 个。我还尝试 运行 在循环中使用 set() 命令来避免 num2cell 调用,因为我认为它比较慢。不幸的是,这进一步减慢了速度。
所以我想知道是否有人熟悉另一种解决方案:
1) 以比我在这里描述的更快更有效的方式更新绘图数据。
2) 前端加载所有这些图形组件(120 个时间点,120 个图形),并且可能只是在我玩我的时间序列时将它们一次一个地放入我的 GUI 中,在我循环播放时通过在我的 UIAxes 中添加和删除每个单独的图形120分。我意识到这会占用更多内存,但我宁愿有更多内存也不愿花费更多时间。
我希望这很清楚,如有任何建议,我们将不胜感激。
您似乎在征求一般性建议。如果您想要更具体的答案,请尝试创建 minimum reproducible example.
否则,一些一般提示:
- 不要在单元格中存储数据。
line
对象的 set()
方法可用于标准数值数组:primative line documentation
MATLAB 中的 Struct
有一些与之相关的开销。看起来您有多个嵌套结构保存数值数组。从该结构检索此数据可能很慢。您始终可以使用 tic/toc 来查看它有多慢。但总的来说,尽可能避免结构并将数字数据存储为自己的变量。有关详细信息,请参阅 arrays of structs vs. structs of arrays. 上的一些建议
我想提高应用程序设计器中 GUI 的效率,即使它涉及一次前端加载图形生成,以节省后续 views/updates 的时间。
我正在尝试更新一个 UIAxes,其中包括 4 个 patch() 句柄和大约 10 个引用大约 30 行的 plot3() 句柄。目标是生成图形,然后能够更新超过 120 个不同时间点的所有数据的位置。 ("Play"通过结果)
问题是更新一次图形大约需要1.5秒。更新 patch() 句柄大约比 plot3() 句柄快一个数量级。虽然我的代码不需要立即 运行,但我希望它可以更新得更快(每个时间点 < 0.5 秒)。
我正在使用以下语法更新(作为示例)我的 plot3 句柄之一,其中包括 3 个不同的线对象(因此引用 {'XData'} 的单元格):
set(p1.foo1,{'XData'},num2cell([foo1.fem.nds(:,1,1) foo1.tib.nds(:,1,1)],2));
set(p1.foo1,{'YData'},num2cell([foo1.fem.nds(:,2,1) foo1.tib.nds(:,2,1)],2));
set(p1.foo1,{'ZData'},num2cell([foo1.fem.nds(:,3,1) foo1.tib.nds(:,3,1)],2));
运行 这大约需要 0.3 秒,并且只是 5 个 plot3 句柄中的 1 个。我还尝试 运行 在循环中使用 set() 命令来避免 num2cell 调用,因为我认为它比较慢。不幸的是,这进一步减慢了速度。
所以我想知道是否有人熟悉另一种解决方案: 1) 以比我在这里描述的更快更有效的方式更新绘图数据。 2) 前端加载所有这些图形组件(120 个时间点,120 个图形),并且可能只是在我玩我的时间序列时将它们一次一个地放入我的 GUI 中,在我循环播放时通过在我的 UIAxes 中添加和删除每个单独的图形120分。我意识到这会占用更多内存,但我宁愿有更多内存也不愿花费更多时间。
我希望这很清楚,如有任何建议,我们将不胜感激。
您似乎在征求一般性建议。如果您想要更具体的答案,请尝试创建 minimum reproducible example.
否则,一些一般提示:
- 不要在单元格中存储数据。
line
对象的set()
方法可用于标准数值数组:primative line documentation
MATLAB 中的 Struct
有一些与之相关的开销。看起来您有多个嵌套结构保存数值数组。从该结构检索此数据可能很慢。您始终可以使用 tic/toc 来查看它有多慢。但总的来说,尽可能避免结构并将数字数据存储为自己的变量。有关详细信息,请参阅 arrays of structs vs. structs of arrays. 上的一些建议