我刚回到MATLAB并且遇到了一些相当基本的绘图问题。我已经搜索过mathworks.com了......
我有一些3D数组,尺寸为200 x 2 x 11.为了给出一些上下文,基本上我有11个时间点,并希望为每个时间点绘制一些2D线。
例如,对于时间1(即myArray(:,:,1)
),我可以生成一些看起来像这样的2D图:
这只是200(x,y)坐标的插值。
我计算了这条线在11个时间段内的演变,并希望以三维方式绘制它。我正在尝试使用网格函数,它接受参数X,Y,Z。我希望我的时间点在x轴上。我的语法有点麻烦。直观地说,我正试图让这样的东西起作用:
for k = 1:11
myArray(:,:,k) = [stDev, ret];
end
% mesh(X,Y,Z):
mesh(1:11, ??, ??)
问题的关键在于我并不完全理解如何将某些多维数组的元素转换为与网格函数兼容的格式。
谢谢!
答案 0 :(得分:0)
在数学上,表面被参数化为X = X(u,v),Y = Y(u,v),Z = Z(u,v),其中u和v是参数。在MATLAB术语中,参数以及矩阵X,Y,Z的垂直和水平索引。在您的情况下,您需要X,Y,Z为200乘11矩阵。
Y和Z中的坐标取自您的3D数组:
Y = squeeze(M(:,1,:));
Z = squeeze(M(:,2,:));
但是X应该填充时间值,在你的情况下是1到11之间的数字。 (通常,1:size(M,3)
。)要将这些值复制到200行,请使用带有
的Kronecker产品
一个200 1s的向量:
X = kron(1:size(M,3), ones(size(M,1),1))
现在mesh(X,Y,Z)
将提供所需的表面。
出于演示目的,我使用了11条曲线,这些曲线都是具有不同缩放比例的平方根图。
M = zeros(200,2,11);
for k=1:11
M(:,1,k) = 1:200;
M(:,2,k) = sqrt(k*(1:200));
end
X = kron(1:size(M,3), ones(size(M,1),1));
Y = squeeze(M(:,1,:));
Z = squeeze(M(:,2,:));
mesh(X,Y,Z);