Matlab 冲浪()到bar3();矩阵尺寸必须一致,而不是渲染网格“;
这是我模拟水面的尝试。当我使用Matlab 冲浪()到bar3();矩阵尺寸必须一致,而不是渲染网格“;,matlab,matrix,dimensions,Matlab,Matrix,Dimensions,这是我模拟水面的尝试。当我使用surf()函数时,它工作正常。但当我将其更改为bar3()时,会出现以下错误:“矩阵尺寸必须一致,而不是渲染网格”。谁能告诉我怎么修理这个吗?这是我的密码: n=60; i = 2:n-1; j = 2:n-1; H = ones(n,n); Dropx=30; %x and y coordinate of the droplet Dropy=30; width=20;
surf()
函数时,它工作正常。但当我将其更改为bar3()
时,会出现以下错误:“矩阵尺寸必须一致,而不是渲染网格”。谁能告诉我怎么修理这个吗?这是我的密码:
n=60;
i = 2:n-1;
j = 2:n-1;
H = ones(n,n);
Dropx=30; %x and y coordinate of the droplet
Dropy=30;
width=20;
r=width/2;
dt=0.1;
dx=0.3;
%%% add droplet to the surface %%%
[x,y] = ndgrid(-1.5:(2/(width/1.5-1)):1);
D = 8*exp(-5*(x.^2+y.^2));
w = size(D,1);
i2 = (Dropx-r):w+(Dropx-r)-1;
j2 = (Dropy-r):w+(Dropy-r)-1;
H(i2,j2) = H(i2,j2) + D;
oldH=H;
newH=H;
h=surf(newH); % cannot change this to bar3
axis([1 n 1 n -2 8]);
k=0.2; %damping constant
c=2; %wave speed
while 1==1
newH(i,j)=H(i,j)+(1-k*dt)*(H(i,j)-oldH(i,j))-...
dt^2*c^2/dx^2*((4*H(i,j)-H(i+1,j)-H(i-1,j)-H(i,j+1)-H(i,j-1))...
+0.4*(4*H(i,j)-H(i+1,j+1)-H(i+1,j-1)-H(i-1,j+1)-H(i-1,j-1)));
set(h,'Zdata', newH(i,j));
oldH=H;
H=newH;
pause(0.05);
end
问题在于处理打印的方式
h=bar3(newH);
在h中打印数据并存储用于修补图形对象的句柄。当您编写以下内容时:
set(h,'Zdata', newH(i,j));
您假设句柄“Zdata”是一个60x60数组,而bar3则不是这样。只要写
output = get(h,'Zdata')
看到这一点。这样做需要更多的数据处理,但这似乎很乏味
我提出了一个简单的解决方案,只需在每一个时间步重新填写即可:
oldH=H;
newH=H;
h=bar3(newH);
axis([1 n 1 n -2 8]);
k=0.2; %damping constant
c=2; %wave speed
while 1==1
newH(i,j)=H(i,j)+(1-k*dt)*(H(i,j)-oldH(i,j))-...
dt^2*c^2/dx^2*((4*H(i,j)-H(i+1,j)-H(i-1,j)-H(i,j+1)-H(i,j-1))...
+0.4*(4*H(i,j)-H(i+1,j+1)-H(i+1,j-1)-H(i-1,j+1)-H(i-1,j-1)));
h=bar3(newH);
axis([1 n 1 n -2 8]);
oldH=H;
H=newH;
pause(0.05);
end
正如David所说,问题在于
bar3
将原始数据矩阵转换为一个特殊的ZData
。这个新的补丁是一个单元数组,长度为n
(代码中为60),每个补丁都是一个大小为[n*6,4]
的数组。因此,您不能直接将新矩阵分配给ZData
除了每次重新创建情节外,还有一个解决方案。基本上,它直接修改ZData。您可以逐个元素直接修改Zdata
。为此,请尝试以下代码,而不是调用set(h,'Zdata',newH(i,j))代码>:
h
是绘图的句柄;对于bar3
,其长度为n
,即矩阵的第一个维度。因此,对于每个条形列,您可以根据其格式设置ZData
。矩阵的每个元素V被转换为该矩阵:
NaN 0 0 NaN
0 V V 0
0 V V 0
NaN 0 0 NaN
NaN 0 0 NaN
NaN NaN NaN NaN
因此,为了构建每个列的完整ZData
,您可以使用更新矩阵的列和该原子矩阵调用函数kron
这不是很快;在我的电脑上,显示有时会滞后,但比每次重新创建条形图要快。使用surf
更快,因为要绘制的面片更少。我无法解决这个问题,但问题是h=mesh(h)
为Surfaceplot
对象创建了一个句柄h
。另一方面,bar3
创建一系列面片图形对象,每个对象都有自己的控制柄。因此h=bar3(h)
创建一个控制柄向量来修补图形对象。每个句柄对应于矩阵的每一列H
。非常感谢。每一个时间点都回复解决了这个问题。谢谢。这正是我一直在寻找的。很遗憾,我没有足够的声望投票支持你的答案。谢谢你@user3611143我认为你应该能够接受这个答案,即使声誉很低。你可以在以后获得更高声誉时进行投票;)很乐意帮忙!
NaN 0 0 NaN
0 V V 0
0 V V 0
NaN 0 0 NaN
NaN 0 0 NaN
NaN NaN NaN NaN