【发布时间】:2019-02-11 20:38:27
【问题描述】:
我有三个向量,X、Y 和 Z,它们表示在矩阵 V(即V = f(X,Y,Z))中找到的一些数据的 3d 坐标。以下是该数据的一些特征(假设/断言,如果您愿意的话):
-
X和Y的长度相同,但(通常)不同于Z的长度。numel(X) == numel(Y); X中唯一元素的数量通常与Y中的唯一元素数量不同。-
Z中的所有值都是唯一的。numel(unique(Z)) == numel(Z); V的大小为[numel(X), numel(Z)]。
过去,我没有区分X和Y,而是使用单个索引来引用它们,这样可以轻松绘制具有“XY组合编号”的图表(即1:numel(X))在一个轴上,Z 在另一个轴上,所以V 的大小效果很好。
目前,我想分别查看X 和Y 的效果,这就是为什么我想使用scatter3 和contourslice 的混合在3d 中可视化它。
分散部分很简单,因为我可以 repmat X 和 Y 沿着它们的单一维度 numel(Z) 次,对于 Z 也是如此(使用 numel(X))。这导致:
至于轮廓,这些需要以 3d 数组的形式提供数据——这意味着我必须将点放置在结构化网格中。使用meshgrid 创建网格坐标XX、YY、ZZ 很简单:
[ XX, YY, ZZ ] = meshgrid( unique(X), unique(Y), unique(Z) );
我正在努力创建 3d 数组 VV。
从上图我们可以看出,大部分卷不包含点 - 我非常希望保持这种状态。换句话说,理想的VV应该只包含与原始数据集对应的点,其余空间应该包含NaNs。
griddata 和 interp3 之类的函数执行插值,这将“填充”点云内部的漏洞 - 这是非常不希望的。我认为这里可以使用索引来使用来自V 的值填充VV,但我想不出办法。
我的问题是:如何生成不包含任何插值数据的VV?
这是一个最小的例子:
%% Generate some data:
X = randi(10,100,1);
Y = randi(15,100,1) - 5;
Z = 1:50;
V = X./Y.*Z;
%% Scatter plot:
nXY = numel(X); nZ = numel(Z);
figure();
scatter3( reshape( repmat(X,[1, nZ]), [], 1), ...
reshape( repmat(Y,[1, nZ]), [], 1), ...
reshape( repmat(Z,[nXY, 1]), [], 1), ...
[], V(:), '.');
%% Contours:
% Create the 3d grid:
[XX, YY, ZZ] = meshgrid( unique(X), unique(Y), unique(Z) );
% Preallocate VV:
VV = NaN(size(XX));
% Populate VV: <--------------------------------------------- Help needed with this stage
ind = randperm( numel(XX), numel(V) ); % PLACEHOLDER
VV(ind) = V;
% Plot:
hold on; contourslice(XX, YY, ZZ, VV, X(2), Y(3), Z(10) );
【问题讨论】:
标签: matlab matrix multidimensional-array indexing vectorization