繁体   English   中英

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

[英]MATLAB: ??? In an assignment A(I) = B, the number of elements in B and I must be the same

我正在做一个项目,对意大利面周围的酱汁流动进行建模,使用名为prtcl_3d_ss_visualize.m的斯托克斯流的 BEMLIB 代码,该代码可从“http://dehesa.freeshell.org/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_3d_ss_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 (零个元素)具有不同的大小,当您尝试将一个分配给另一个时,您会收到错误。

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


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

它在那个网站上说:

BEMLIB 是一个 Fortran 77(与 Fortran 90 兼容)和 Matlab 代码的边界元软件库,由 C. Pozrikidis 编写,使用软件库 BEMLIB 的边界元方法实用指南,'' Champan & Hall/CRC,( 2002)。 本书的第 8-12 章包含 BEMLIB 用户指南

我建议您需要BEMLIB 用户指南来帮助您了解代码的作用以及如何使用它,直到您明白您不应该对其进行任何更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM