我打算使用Matlab在其状态空间上绘制随机过程的概率分布。状态空间可以用一个 150x150 矩阵的下三角来表示。请看图(没有网格的冲浪图)在某个时间点的概率分布。
我们可以看到,图中有高度的对称性,但是因为它被绘制成一个方阵,所以看起来有点奇怪。如果我们可以变换矩形,绘图看起来会很完美。我的问题是,如何使用Matlab将下三角形部分绘制/转换为等边三角形?
我打算使用Matlab在其状态空间上绘制随机过程的概率分布。状态空间可以用一个 150x150 矩阵的下三角来表示。请看图(没有网格的冲浪图)在某个时间点的概率分布。
我们可以看到,图中有高度的对称性,但是因为它被绘制成一个方阵,所以看起来有点奇怪。如果我们可以变换矩形,绘图看起来会很完美。我的问题是,如何使用Matlab将下三角形部分绘制/转换为等边三角形?
此功能应该为您完成这项工作。如果没有,请告诉我。
function matrix_lower_tri_to_surf(A)
%Displays lower triangle portion of matrix as an equilateral triangle
%Martin Stålberg, Uppsala University, 2013-07-12
%mast4461 at gmail
siz = size(A);
N = siz(1);
if ~(ndims(A)==2) || ~(N == siz(2))
error('Matrix must be square');
end
zeds = @(N) zeros(N*(N+1)/2,1); %for initializing coordinate vectors
x = zeds(N); %x coordinates
y = zeds(N); %y coordinates
z = zeds(N); %z coordinates, will remain zero
r = zeds(N); %row indices
c = zeds(N); %column indices
l = 0; %base index
xt = 1:N; %temporary x coordinates
yt = 1; %temporary y coordinates
for k = N:-1:1
ind = (1:k)+l; %coordinate indices
l = l+k; %update base index
x(ind) = xt; %save temporary x coordinates
%next temporary x coordinates are the k-1 middle pairwise averages
%calculated by linear interpolation through convolution
xt = conv(xt,[.5,.5]);
xt = xt(2:end-1);
y(ind) = yt; %save temporary y coordinates
yt = yt+1; %update temporary y coordinates
r(ind) = N-k+1; %save row indices
c(ind) = 1:k; % save column indices
end
v = A(sub2ind(size(A),r,c)); %extract values from matrix A
tri = delaunay(x,y); %create triangular mesh
h = trisurf(tri,x,y,z,v,'edgecolor','none','facecolor','interp'); %plot surface
axis vis3d; view(2); %adjust axes projection and proportions
daspect([sqrt(3)*.5,1,1]); %adjust aspect ratio to display equilateral triangle
end %end of function