簡體   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