【发布时间】:2017-08-06 00:14:26
【问题描述】:
我正在 MATLAB 中运行模拟,其中我有一个大型 3D 数据集,每个时间步都会发生变化。我正在尝试使用 3D 散点图来可视化数据,其中的点随着模拟的进行而呈现不同的位置、大小、颜色和透明度级别。尺寸和颜色信息是多余的。
在 MATLAB 中渲染和旋转图形既慢又不稳定。我的电脑有一个 4 GHz i7-4790 CPU 和一个 NVIDIA GeForce GTX 750 Ti 显卡。我在 Windows 7 上使用 Matlab R2016a。我检查了我的 MATLAB OpenGL 设置,硬件支持级别已满。 (硬件 OpenGL 是透明所必需的。)此外,我正在使用 GPU-Z 监控我的 GPU 使用情况,在绘图和旋转期间,GPU 负载峰值仅为 25-30%。
这是我的代码示例:
load sample_data2
channels_matrix = cat(1, channels{:});
num_channels = length(channels);
channel_lengths = cellfun(@(x) size(x, 1), channels);
figure(1);
for i = 1:num_channels
g = plot3(channels{i}(:, 1), channels{i}(:, 2), channels{i}(:, 3), 'k');
set(g, 'LineWidth', 1.5)
hold on;
text(channels{i}(1, 1), channels{i}(1, 2), channels{i}(1, 3), num2str(i))
end
caxis([0 1])
colorbar
drawnow
numDivisions = 8;
ptsPerDivision = numel(grid_x)/numDivisions;
T = 1000;
numplotpts = 2E4;
for t = 1:T
plot_signal = nan(size(grid_x));
plot_signal(sort(randsample(numel(grid_x), numplotpts))) =...
sort(rand(numplotpts, 1));
tic
for i = 1:numDivisions
temp = plot_signal(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
yplot = grid_y(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
xplot = grid_x(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
zplot = grid_z(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
if t == 1
h(i) = scatter3(yplot(~isnan(temp)), xplot(~isnan(temp)),...
zplot(~isnan(temp)), 50*temp(~isnan(temp)), temp(~isnan(temp)), ...
'filled', 'MarkerFaceAlpha', exp(-i)^0.25);
else
h(i).XData = yplot(~isnan(temp));
h(i).YData = xplot(~isnan(temp));
h(i).ZData = zplot(~isnan(temp));
h(i).SizeData = 50*temp(~isnan(temp));
h(i).CData = temp(~isnan(temp));
end
end
drawnow
toc
end
这里是data 的链接。有什么方法可以加快渲染速度并使旋转更平滑?我注意到将所有数据点的大小固定为单个标量可以大大加快渲染和旋转速度。是否可以保持代码中的大小,并且仍然可以快速渲染和旋转图形?
编辑:我发布了一个related question。
【问题讨论】:
-
是否需要实时播放,或者您可以将其渲染为电影 (.avi) 以便以后更流畅地播放?
-
实时不是必需的,但最好。
-
我在您的代码(例如 tic/toc)中的调用之间出现了大约 0.5 秒的延迟。你现在在做什么?
-
当我运行上面链接的代码时,toc 命令输出每次迭代大约 9.5 秒的经过时间。如果我将大小数据固定为某个标量,则每次迭代它会下降到大约 0.7 秒。是否有可能进一步加速?
-
我可以使经过的时间下降到 5.5 秒,但前提是我更改您的代码并将
drawnow放入 for 循环中(这可能是您希望它看到更改的地方)。
标签: matlab 3d data-visualization matlab-figure scatter-plot