我有一个大数据集(几十万个3D点(x,y,z)。 我希望在Matlab中显示这些点作为立方体(v.R2016a)(使用(x,y,z)点作为立方体质心)。 (数据点还有其他属性:A,B;我希望用它们为立方体着色,并指示立方体的“alpha”或透明度)。
我(温和地)改编了Olivers' PlotCube 代码来自:
http://au.mathworks.com/matlabcentral/fileexchange/15161-plotcube
为每个立方体实现可变颜色和透明度,但尝试绘制甚至数据的子集(比如20,000点)需要永远在这台计算机上(2.5GHz i7,16GB RAM + 4GB GPU,64位Windows) 10)。 此外,一旦最终绘制(在新的Matlab图形窗口中),我无法在3D中旋转对象;它也是(RAM?GPU?)密集的。
我已经尝试过增加Java堆内存(从128MB到4GB),以防出现瓶颈(无济于事):
Matlab>主页>偏好> Matlab>一般> Java堆内存
如果所有输入变量的范围都只有0-255(比方说),则可以更改标准' double'中的所有数据类型。 (浮点整数)转换为uint8格式? (因此推测计算/图形显示速度)。
有没有办法更改PlotCube代码以允许此操作? (uint8或uint16变量)
请注意,' alpha' (透明度)值必须在0-1范围内。 (所以有没有办法使matlab只为每个点存储/使用uint8精度,但是在这个范围内的十进制格式?一旦我将它转换为十进制,它就会回到' double'类型例如,通过将每个值(0-255范围)除以255来“标准化”它:0-1范围。)
请注意,代码中的所有计算都可以轻松地在' double'中执行。整个数据集上的数据类型格式;它只是绘制的最终数据点(可能)需要采用较小的数据格式(以减少绘制和旋转3D对象的内存要求)。
如果有更聪明的方法在matlab中绘制/显示点的大数据集(除了/更改数据类型之外),我非常感谢任何建议!
我已经读过'预先分配' Matlab循环中的数组可以节省大量时间*,但主要用于“#”;循环(下面),我用来绘制所有点,我不知道如何实现预初始化。
% Run for loop for every point; an origin for each unique point.
% Note that edges, alpha and colour are all constant here for every point.
for i = 1:length(origin)
plotcube(edges,origin(i,:),alpha,[0 0 1])
end
感谢您提供任何帮助/建议!
PlotCube的代码(取自上面的第一个网址)是:
function plotcube(varargin)
% PLOTCUBE - Display a 3D-cube in the current axes
%
% PLOTCUBE(EDGES,ORIGIN,ALPHA,COLOR) displays a 3D-cube in the current axes
% with the following properties:
% * EDGES : 3-elements vector that defines the length of cube edges
% * ORIGIN: 3-elements vector that defines the start point of the cube
% * ALPHA : scalar that defines the transparency of the cube faces (from 0
% to 1)
% * COLOR : 3-elements vector that defines the faces color of the cube
%
% Example:
% >> plotcube([5 5 5],[ 2 2 2],.8,[1 0 0]);
% >> plotcube([5 5 5],[10 10 10],.8,[0 1 0]);
% >> plotcube([5 5 5],[20 20 20],.8,[0 0 1]);
% Default input arguments
inArgs = { ...
[10 56 100] , ... % Default edge sizes (x,y and z)
[10 10 10] , ... % Default coordinates of the origin point of the cube
.7 , ... % Default alpha value for the cube's faces
[1 0 0] ... % Default Color for the cube
};
% Replace default input arguments by input values
inArgs(1:nargin) = varargin;
% Create all variables
[edges,origin,alpha,clr] = deal(inArgs{:});
XYZ = { ...
[0 0 0 0] [0 0 1 1] [0 1 1 0] ; ...
[1 1 1 1] [0 0 1 1] [0 1 1 0] ; ...
[0 1 1 0] [0 0 0 0] [0 0 1 1] ; ...
[0 1 1 0] [1 1 1 1] [0 0 1 1] ; ...
[0 1 1 0] [0 0 1 1] [0 0 0 0] ; ...
[0 1 1 0] [0 0 1 1] [1 1 1 1] ...
};
XYZ = mat2cell(...
cellfun( @(x,y,z) x*y+z , ...
XYZ , ...
repmat(mat2cell(edges,1,[1 1 1]),6,1) , ...
repmat(mat2cell(origin,1,[1 1 1]),6,1) , ...
'UniformOutput',false), ...
6,[1 1 1]);
cellfun(@patch,XYZ{1},XYZ{2},XYZ{3},...
repmat({clr},6,1),...
repmat({'FaceAlpha'},6,1),...
repmat({alpha},6,1)...
);
view(3);
最终结果是得到Ben在图中所取得的成就:
来自Bens PlotCube image 的