EDA365电子论坛网
标题:
如何在parfor循环中使用之前定义过的符号变量而不会出错
[打印本页]
作者:
shuddkk
时间:
2021-3-22 13:26
标题:
如何在parfor循环中使用之前定义过的符号变量而不会出错
for i=1:2*n+2 %生成2N+2阶的矩阵
" T& L' C+ G Q1 Z% \
if i==1
) `" M% w9 v+ h7 G$ e3 d
f(i)=sigmar1(i)+P0; %第1层公式
: s7 J, S. K2 ~
parfor j=1:2*n+2
; H) ^7 N9 V8 a! [! e2 O+ x+ j
) i- [. l9 t4 E9 u: d& B Q3 Q+ `
if j<=n
# o$ v' k3 ^( Y# ~
KK(i,j)=equationsToMatrix(f(i),['D_',num2str(j)]); %将线性方程组写成矩阵的形式
! ]1 \% o3 z- l2 [7 |: U k3 |3 O
elseif j<=2*n
3 z# K) Z6 D3 U* p( {
KK(i,j)=equationsToMatrix(f(i),['E_',num2str(j-n)]);
7 D$ y- u9 x* C8 z: k* }1 O
elseif j==2*n+1
% u# A! g/ ]( r* \1 J
KK(i,j)=equationsToMatrix(f(i),epsilon0);
8 y6 H3 {2 |. q* @
else
6 t0 b: z3 r6 w: `5 L7 L$ t
KK(i,j)=equationsToMatrix(f(i),gama0);
3 @. V) _8 e+ K! f! m
end
- u0 s; P& A. o, }) L+ S
end
' U2 Y# W: w/ m2 @) [
elseif i<=n
6 \+ g3 Y( t4 U. h$ c
f(i)=Ur1(i-1)-Ur2(i); %第2层到n层公式
6 C0 j a" Z+ h
for j=1:2*n+2
! C6 c0 B; Q; \8 G+ J5 E
if j<=n
) a& ]1 l D9 T. _4 s4 O
KK(i,j)=equationsToMatrix(f(i),['D_',num2str(j)]);
% Q' L6 m6 ]' w4 f( N) H* Z* P
elseif j<=2*n
+ T' |- ~2 p! H# v S1 o
KK(i,j)=equationsToMatrix(f(i),['E_',num2str(j-n)]);
5 z2 t i0 B2 n: t
elseif j==2*n+1
9 P/ `& K$ N) B/ E0 J" ^
KK(i,j)=equationsToMatrix(f(i),epsilon0);
8 k2 Z# g/ @* M9 ]$ W
else
( ]! `- C3 o2 q$ [* t9 G
KK(i,j)=equationsToMatrix(f(i),gama0);
9 T1 ^: q" E: w7 C
end
' O% `/ b% z" S/ k
end
# I! f2 g# I0 g- F7 K( l) I9 [
elseif i<=2*n-1
$ y0 L& E# B7 z9 x
f(i)=sigmar1(i-n)-sigmar2(i-n+1); %第N+1层到2N-1层公式
# w' W" t X/ w% t3 s- o
for j=1:2*n+2
# {. J# Y3 Z' T' M' K! U$ f" {
if j<=n
, ]/ r6 d! c0 ^" [" u* C% P0 V
KK(i,j)=equationsToMatrix(f(i),['D_',num2str(j)]); %生成2N+2阶的矩阵
; N/ O* U" Q: u+ O7 F/ y
elseif j<=2*n
7 t3 W, ]6 N) }, v
KK(i,j)=equationsToMatrix(f(i),['E_',num2str(j-n)]);
/ s, I2 L" }3 ? Z6 l- c2 m+ B; q4 e: v
elseif j==2*n+1
; M6 V6 [! o' j+ v. i
KK(i,j)=equationsToMatrix(f(i),epsilon0);
$ G$ ~$ h P* H! k5 }1 n# u
else
; r. x* o" n3 ^ {
KK(i,j)=equationsToMatrix(f(i),gama0);
5 X+ Q- U$ a( ~# b
end
, D: _& y6 i: C+ w: M
end
/ ]; I. r9 h, T1 C" |( J
elseif i==2*n
' [2 F! |& s$ P
f(i)=sigmar1(n); %第2*N层公式
1 Y3 J8 O& H; n/ K( T
for j=1:2*n+2
$ s: Q: I( x% ~, ?3 M
if j<=n
, j8 z+ A8 Y" s- c' y1 \: J* Z
KK(i,j)=equationsToMatrix(f(i),['D_',num2str(j)]);
$ n ?" Z2 ~ L$ u% N" o0 n+ y
elseif j<=2*n
" t8 I; |$ ?1 ]4 p% c2 T" U
KK(i,j)=equationsToMatrix(f(i),['E_',num2str(j-n)]);
. n/ @8 b! y+ _) F9 p
elseif j==2*n+1
$ i, _- g5 l( m) \& k& l
KK(i,j)=equationsToMatrix(f(i),epsilon0);
* g8 c) u! A4 Y2 L* H1 V
else
1 x1 @; i6 q9 Y s; E* Y
KK(i,j)=equationsToMatrix(f(i),gama0);
/ m& d& N V9 v m6 w
end
6 o4 [+ A! X7 ^2 v7 j5 T
end
8 @. `% e8 c6 O; M
elseif i==2*n+1
2 a, M N$ g3 B
for j=1:2*n+2
7 ?1 O: [& D7 q E5 `" m
if j<=n
; Z# T4 b _5 S, ?' R
KK(i,j)=xxD(j);
& M1 E# }: n$ g+ U
elseif j<=2*n
8 G$ i) r ? G9 f( F; v/ l# O1 A
KK(i,j)=xxE(j-n);
$ W$ B0 Q# ^' L
elseif j==2*n+1
( V# {, u7 F& G7 c
KK(i,j)=tempepsilonx;
8 Q) k& _- n2 k3 \; V5 J
else
_/ W. [' H2 y* n
KK(i,j)=tempgamax;
1 T3 a d) q( q8 q5 h
end
! ?( B* X6 r% R- @2 W4 |) m$ g
end
, U" ~$ A' M9 K2 }, _
elseif i==2*n+2
, }1 K& ~3 h$ J" k( i
for j=1:2*n+2
- X+ h+ d7 u6 i, e ?; x
if j<=n
# G/ U8 e3 _4 O" T H
KK(i,j)=yyD(j);
7 w" h4 h2 y% k; p# C
elseif j<=2*n
; O m& p( H4 D* g/ L7 s: d& E
KK(i,j)=yyE(j-n);
) \% W, T3 W: a1 I6 t. D% A8 b% V9 W
elseif j==2*n+1
w) ]7 A" g; V2 n u- }
KK(i,j)=tempepsilony;
) j: P* S+ y" W' S" _
else
4 y2 ]- w# o* K0 k: Y. `
KK(i,j)=tempgamay;
5 b% Z7 o5 k: o- n0 e
end
8 D, W r' F7 Y/ }+ g- a. ~/ G
end
3 T6 `$ _) t3 \6 o1 J. X
end
4 x1 l- t# ]/ ]7 n* ~; y# F
end
2 s7 n; x5 D& D7 Y5 V; ]1 H
想把其中的一部分for循环改成parfor循环,但是在运行时会出现错误
( t. o) m. K- ~6 Q- [; U
Analyzing and transferring files to the workers ...done.
6 X% H% R3 t) N9 o& U5 U
错误使用 Matrix_Of_Coefficient_K (line 195)
/ Z8 V, V( L/ V1 _
在 'gama0' 的工作进程上引发了 UndefinedFunction 错误。这可能是因为在这
/ e+ ?. v" m( M% }7 W9 _- ^
些工作进程上无法访问包含 'gama0' 的文件。使用 addAttachedFiles(pool,
/ B, X) W0 d' \) d G
files) 指定要附加的必要文件。有关详细信息,请参阅
5 B' v' F/ x- D/ n. h
"parallel.Pool/addAttachedFiles" 的文档。
. R8 a7 s; y3 p0 m% {# v0 _6 L3 J
* S# {* b7 R" F3 ~. Y3 c
原因:
0 c8 I1 f* B8 Q- N3 V( W( ?
未定义函数或变量 'gama0'。
. d( P! |7 d3 T q
作者:
kekek
时间:
2021-3-22 14:05
帮你顶一下
作者:
llbnmo
时间:
2021-3-22 15:08
我的解决办法是运算部分 弄成函数 函数里面需要用的是 数据用 函数输入方式传递,这样就避免很多的 par 运行过程中的 参数隔离检查报错,而且弄成函数后 循环体看着也简单明了。
作者:
小小鲁班
时间:
2021-3-22 15:23
来学习一下
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2