MATLAB:???在赋值A(I)=B中,B和I中的元素数必须相同

MATLAB:???在赋值A(I)=B中,B和I中的元素数必须相同,matlab,elements,flow,Matlab,Elements,Flow,我正在做一个项目,用一个名为prtcl_3d_ss_visualize.m的斯托克斯流BEMLIB代码对意大利面周围的酱汁流进行建模,该代码可从“”获得。代码如下: %--- file2 = fopen('prtcl_3d_ss_visualize.m') Npnt = fscanf(file2,'%f',[1,1]) Nvert = fscanf(file2,'%f',[1,1]) Nface = fscanf(file2,'%f',[1,1]) vert = fscanf(fil

我正在做一个项目,用一个名为prtcl_3d_ss_visualize.m的斯托克斯流BEMLIB代码对意大利面周围的酱汁流进行建模,该代码可从“”获得。代码如下:

%---
file2 = fopen('prtcl_3d_ss_visualize.m')
Npnt   = fscanf(file2,'%f',[1,1])
Nvert  = fscanf(file2,'%f',[1,1])
Nface  = fscanf(file2,'%f',[1,1])
vert   = fscanf(file2,'%f',[3,Nvert]);
wall   = fscanf(file2,'%f',[1,1])
fclose(file2)
%---

for i=1:Nvert
save = vert(2,i);
vert(2,i) = vert(3,i);
vert(3,i) = save;
end

Ic=0; 
for i=1:Nface
for j=1:Npnt
  Ic=Ic+1;
  fac(j,i) = Ic;
end
end

patch('faces',Nfac’,'vertices',vert’,...
      'FaceColor','y',...
      'FaceLighting','phong',...
      'BackFaceLighting','lit')
%light('Position',[1 3 2]);
%light('Position',[-3 -1 3]);
%material dull
%material shiny
%axis vis3d off
axis([-1.5 1.5 -1.5 1.5 -0.5 2.5 ])
%view(45,34)
xlabel('x')
ylabel('z')
zlabel('y')

xw(1)=-1.5; zw(1)=-1.5; yw(1)=wall;
xw(2)= 1.5; zw(2)=-1.5; yw(2)=wall;
xw(3)= 1.5; zw(3)= 1.5; yw(3)=wall;
xw(4)=-1.5; zw(4)= 1.5; yw(4)=wall;
xw(5)=-1.5; zw(5)=-1.5; yw(5)=wall;
patch(xw,zw,yw,yw); 
hold off
在matlab中输入代码时,我遇到了几个错误,第一个错误是我解决了将fopen('prtcl_3d')更改为fopen('partcl_3d_ss_visualize.m'),这是文件的名称。 我遇到的第二个错误是输入错误

patch('faces',Nfac’,'vertices',vert’,...
      'FaceColor','y',...
      'FaceLighting','phong',...
      'BackFaceLighting','lit')
Nfac最初是fac,但我得到了错误?未定义的函数或变量fac,所以我将其更改为已定义的变量Nfac

我现在面临的问题是代码的最后一部分。当我进入第一行时

xw(1)=-1.5; zw(1)=-1.5; yw(1)=wall;
我得到错误信息:“在赋值A(I)=B中,B和I中的元素数必须相同。”

我在xw,zw,yw输入的其余部分也得到了这个,我做错了什么

非常感谢,

阿基尔

我解决了将fopen(“prtcl_3d”)更改为 fopen('partcl_3d_ss_visualize.m'),它是文件的名称

不,你没有解决它,你把它弄坏了。在原始脚本中,
partcl\u 3d\u ss\u visualize.m
(或者至少是我在互联网上找到的版本),我们有以下几行代码:

file2 = fopen('prtcl_3d.net')
Npnt   = fscanf(file2,'%f',[1,1])
Nvert  = fscanf(file2,'%f',[1,1])
Nface  = fscanf(file2,'%f',[1,1])
vert   = fscanf(file2,'%f',[3,Nvert]);
wall   = fscanf(file2,'%f',[1,1])
fclose(file2)
这将打开某种类型的数据文件
prtcl_3d.net
,并加载一些必需的值(该文件可能包含在您下载的代码中的某个地方)。您要让它做的是让脚本自己加载,并尝试在文件开头找到一些不存在的浮点数

完成此操作后,
wall
的输出可能为空。因此,
yw(1)
(1个元素)和
wall
(零元素)具有不同的大小,当您尝试将一个元素分配给另一个元素时,会出现错误

重要提示:之前不会出错,因为它能够打开文件并尝试读取某些内容-您的工作是检查读取的内容是否正确。在这种情况下,只需手动查看您的工作区就足够了。在其他情况下,可以使用诸如
isempty
isnumeric
size
等函数来完成错误检查,具体取决于您期望的输出类型


关于
fac
/
Nfac
,我认为这个脚本并不独立,您应该在创建正确变量的脚本或函数之前运行另一个脚本或函数

网站上写着:

BEMLIB是Fortran 77(与Fortran 90兼容)和Matlab代码的边界元软件库,与C.Pozrikidis的《边界元方法实用指南》一书一起出版,该书与软件库BEMLIB合著,Champan&Hall/CRC(2002)。本书第8-12章包含BEMLIB用户指南


我建议您需要《BEMLIB用户指南》
来帮助您理解代码的作用和使用方法,直到您明白不应该对其进行任何更改。

非常感谢您,我对编码是新手(显然),可能有点太多我无法理解的地方,您的回答非常有用。