【问题标题】:MATLAB: ??? In an assignment A(I) = B, the number of elements in B and I must be the same马赛克:???在赋值 A(I) = B 中,B 和 I 中的元素个数必须相同
【发布时间】:2014-04-23 12:00:28
【问题描述】:

我正在做一个项目,使用名为 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 输入,我也得到了这个,我做错了什么?

非常感谢,

阿基尔

【问题讨论】:

    标签: matlab elements flow


    【解决方案1】:

    我解决了将 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 用户指南来帮助您了解代码的作用以及如何使用它,直到您明白不应对其进行任何更改。

    【讨论】:

    • 非常感谢,我是编码新手(显然)并且可能比我能咀嚼的更多,您的回答非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2016-04-26
    相关资源
    最近更新 更多