MATLAB:具有大型数据集的PlotCube。使用uint8 uint16数据类型?预分配?

时间:2016-05-06 01:24:24

标签: matlab plot matlab-figure

我有一个大数据集(几十万个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

3D voxel Display in matlab

0 个答案:

没有答案