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*n3 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*n7 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+12 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*n8 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" _            else4 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    end4 x1 l- t# ]/ ]7 n* ~; y# F
end2 s7 n; x5 D& D7 Y5 V; ]1 H
想把其中的一部分for循环改成parfor循环,但是在运行时会出现错误
( t. o) m. K- ~6 Q- [; UAnalyzing 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