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