Phụ lục-Lệnh và hàm 224 Phan Thanh Tao - 2004 tỉí khạc khäng, hồûc chè âënh, cạc pháưn tỉí âàût trãn p âỉåìng chẹo B l ma tráûn min(m,n) hng v p cäüt, thỉång âáưy â (nhỉng khäng cáưn thiãút), cọ cạc cäüt l cạc âỉåìng chẹo ca A. d l vectå âäü di p cọ cạc thnh pháưn ngun chè âënh cạc âỉåìng chẹo trong A Mäüt cạch thä så, A, B v d quan hãû båíi for k = 1:p B(:,k) = diag(A,d(k)) end Bäún thao tạc khạc nhau, phán biãût theo säú âäúi säú nháûp, cọ thãø dng våïi SPDIAGS l: Láúy ra táút c cạc âỉåìng chẹo khạc khäng: [B,d] = spdiags(A); Láúy ra âỉåìng chẹo chè âënh: B = spdiags(A,d); Thay cạc âỉåìng chẹo chè âënh: A = spdiags(B,d,A); Tảo mäüt ma tráûn thỉa tỉì cạc âỉåìng chẹo ca nọ: A = spdiags(B,d,m,n); Quan hãû chênh xạc trong A, B v d l: if m >= n for k = 1:p for j = max(1,1+d(k)):min(n,m+d(k)) B(j,k) = A(j-d(k),j); end end if m < n for k = 1:p for i = max(1,1-d(k)):min(m,n-d(k)) B(i,k) = A(i,i+d(k)); end end end Vi pháưn tỉí ca B, ỉïng våïi cạc vë trê “ bãn ngoi ” A, khäng xạc âënh âỉåüc bàòng cạc vng làûp ny. Chụng khäng âỉåüc tham chiãúu khi B l âäúi säú nháûp v âỉåüc dàût giạ trë 0 khi B l âäúi säú xút. Vê dủ, cạc lãûnh ny phạt sinh mäüt biãøu hiãûn 3 âỉåìng chẹo thỉa ca phẹp vi phán cáúp 2 cäø âiãøn tải n âiãøm e = ones(n,1); A = spdiags([e -2*e e], -1:1, n, n) Lãûnh ny âäøi ma tráûn A thnh ma tráûn kiãøm tra Wilkinson (xem WILKINSON(n)) A = spdiags(abs(-(n-1)/2:(n-1)/2)',0,A) Cúi cng, lãûnh ny sỉía lải 3 âỉåìng chẹo B = spdiags(A) Vê dủ thỉï hai khäng vng A = [ 11 0 13 0 0 22 0 24 0 0 33 0 41 0 0 44 Phụ lục-Lệnh và hàm 225 Phan Thanh Tao - 2004 0 52 0 0 0 0 63 0 0 0 0 74] cọ m = 7, n = 4 v p = 3 Lãûnh [B,d] = spdiags(A) cho d = [-3 0 2]' v B = [ 41 11 0 52 22 0 63 33 13 74 44 24 ] Ngỉåüc lải, våïi B v d nhỉ trãn thç biãøu thỉïc spdiags(B,d,7,4) cho lải A vãư giạ trë gäúc Chuøn ma tráûn âáưy â thnh ma tráûn thỉa SPARSE Xáy dỉûng ma tráûn thỉa tỉì cạc säú khạc 0 v cạc chè säú S = SPARSE( ) l hm gàõn liãưn phạt sinh cạc ma tráûn thüc låïp lỉu trỉỵ thỉa ca MATLAB. Hm ny cọ thãø gi våïi 1, 2, 3, 5 hồûc 6 âäúi säú S = SPARSE(X) chuøn ma tráûn thỉa hồûc âáưy â sang dảng thỉa bàòng cạch b âi cạc pháưn tỉí 0 S = SPARSE(i,j,s,m,n,nzmax) dng cạc dng ca [i,j,s] âãø phạt sinh mäüt ma tráûn thỉa cåỵ mxn våïi khäng gian phán bäú cho nzmax pháưn tỉí khạc 0. Hai vectå chè säú ngun, i v j, v vectå thỉûc hồûc phỉïc, s, táút c cng âäü di, nnz, l säú pháưn tỉí khạc 0 trong ma tráûn thỉa kãút qu. Cọ mäüt säú cạch gi âån gin 6 âäúi säú ny S = SPARSE(i,j,s,m,n) dng nzmax = length(s). S = SPARSE(i,j,s) dng m = max(i) v n = max(j). S = SPARSE(m,n) cạch tàõt ca SPARSE([],[],[],m,n,0). Lãûnh ny phạt sinh ma tráûn thỉa cå bn cåỵ mxn gäưm táút c cạc säú 0. Âäúi säú s v mäüt trong hai âäúi säú i v j cọ thãø l âải lỉåüng vä hỉåïng, trong trỉåìng håüp ny chụng âỉåüc bung ra âãø c 3 âäúi säú âáưu cọ cng âäü di. Vê dủ, trêch ra v sau âọ rạp lải mäüt ma tráûn thỉa: [i,j,s] = find(S); [m,n] = size(S); S = sparse(i,j,s,m,n); Båíi váûy, nhỉ cạc lãûnh ny, nãúu dng v cäüt cúi cng cọ cạc pháưn tỉí khạc 0: [i,j,s] = find(S); S = sparse(i,j,s); Táút c cạc thao tạc gàõn liãưn ca MATLAB vãư säú hc, logic v vãư chè säú âãưu cọ thãø ạp dủng cho cạc ma tráûn thỉa, hồûc cho cạc ma tráûn vỉìa thỉa vỉìa âáưy â. Cạc thao tạc trãn ma tráûn thỉa tr vãư ma tráûn thỉa, âáưy â tr vãư âáưy â. Trong háưu hãút cạc trỉåìng håüp thç cạc thao tạc trãn cạc ma tráûn vỉìa thỉa vỉìa âáưy â tr vãư âáưy â. Ngoải trỉì trỉåìng håüp cọ âỉa vo, kãút Phụ lục-Lệnh và hàm 226 Phan Thanh Tao - 2004 qu ca cạc thao tạc träün thỉa våïi âáưy â cọ cáúu trục thỉa, nghéa l A .* S êt nháút thỉa nhỉ S . Mäüt säú thao tạc, nhỉ S >= 0, phạt sinh cạc ma tráûn thỉa låïn ("Big Sparse", hay "BS" ) ma tráûn thüc täø chỉïc lỉu trỉỵ thỉa nhỉng êt pháưn tỉí 0 FULL Chuøn ma tráûn thỉa sang låïp lỉu trỉỵ âáưy â A = FULL(X) l hm gàõn liãưn chuøn mäüt ma tráûn thỉa sang cå cáúu lỉu trỉỵ âáưy â v cho ra mäüt ma tráûn âáưy â khäng thay âäøi FIND Tçm cạc chè säú ca cạc pháưn tỉí khạc 0 I = FIND(X) tr vãư chè säú ca cạc pháưn tỉí khạc 0 ca vectå X Vê dủ, I = FIND(A>100) , tr vãư cạc chè säú ca cạc pháưn tỉí låìn hån 100 ca A. Xem RELOP [I,J] = FIND(X) tr vãư cạc chè säú dng v cäüt ca cạc pháưn tỉí khạc 0 trong ma tráûn X. Lãûnh ny thỉåìng dng våïi cạc ma tráûn thỉa [I,J,V] = FIND(X) cng tr vãư mäüt vectå cäüt gäưm cạc pháưn tỉí khạc 0 ca X. Lỉu ràòng find(X) v find(X~=0) s cho ra cng I v J, nhỉng hm sau cho V våïi táút c cạc säú 1 SPCONVERT SPCONVERT Chuøn dảng thỉa måí räüng S = SPCONVERT(D) chuøn mäüt mng (nnz hồûc nnz+1)x (3 hồûc 4) våïi cạc dng chỉïa [i,j,s] hồûc [i,j,real(s(i,j)),imag(s(i,j))] sang ma tráûn thỉa tỉång ỉïng. Mäüt dng báút k trong D cọ dảng [m n 0] hồûc [m n 0 0] cọ thãø dng âãø chè âiûnh kêch thỉåïc ca S. Nãúu D â thỉa räưi thç khäng chuøn, vç váûy SPCONVERT cọ thãø dng sau khi D âỉåüc nảp tỉì tãûp MAT hồûc tãûp ASCII Phụ lục-Lệnh và hàm 227 Phan Thanh Tao - 2004 Lm viãûc våïi cạc pháưn tỉí khạc 0 ca ma tráûn thỉa NNZ Säú pháưn tỉí khạc 0 nz = NNZ(S) l säú pháưn tỉí khạc 0 trong S NONZEROS NONZEROS Cạc pháưn tỉí khạc 0 NONZEROS(S) l mäüt vectå cäüt âáưy â cạc pháưn tỉí khạc 0 trong S. Hm ny cho s, nhỉng khäng cho i v j nhỉ [i,j,s] = find(S) NZMAX Täøng säú khäng gian lỉu trỉỵ cạc pháưn tỉí khạc 0 Âäúi våïi ma tráûn thỉa, NZMAX(S) l säú vë trê lỉu trỉỵ phán bäú cho cạc pháưn tỉí khạc 0 trong S. Våïi ma tráûn âáưy â, NZMAX(S) l prod(size(S)). Trong c hai trỉåìng håüp, nnz(S) <= nzmax(S) <= prod(size(S)) SPONES Thay thãú cạc pháưn tỉí khạc 0 våïi cạc säú 1 R = SPONES(S) phạt sinh mäüt ma tráûn våïi cáúu trục thỉa giäúng S, nhỉng våïi cạc säú 1 tải vë trê khạc 0 SPALLOC SPALLOC Phán bäú bäü nhåï cho cạc pháưn tỉí khạc 0 s = SPALLOC(m,n,nzmax) tảo mäüt ma tráûn thỉa cåỵ mxn táút c cạc pháưn tỉí 0 våïi chäù träúng âãø lỉu nzmax pháưn tỉí khạc 0. Vê dủ: s = spalloc(n,n,3*n); for j = 1:n s(:,j) = (mäüt vectå cäüt thỉa gäưm 3 pháưn tỉí khạc 0); end ISSPARSE ISSPARSE Âụng nãúu ma tráûn l ma tráûn thỉa ISSPARSE(S) bàòng 1 nãúu låïp lỉu trỉỵ ca S l thỉa v ngỉåüc lải thç bàòng 0 SPFUN Ạp dủng mäüt hm chè cho cạc pháưn tỉí khạc 0 F = SPFUN('fun',S) ỉåïc lỉåüng hm fun(s) trãn cạc pháưn tỉí khạc 0 ca S. Nghéa l F = SPFUN('exp',S) cọ cng máùu thỉa nhỉ S (trỉì trỉåìng håüp trn dỉåïi), ngỉåüc lải EXP(S) cọ giạ trë 1 tải nåi S cọ giạ trë 0 Xem cạc ma tráûn thỉa SPY Trỉûc quan họa cáúu trục thỉa Phụ lục-Lệnh và hàm 228 Phan Thanh Tao - 2004 SPY(S) v máùu thỉa ca ma tráûn S báút k SPY(S,color) dng mu âạnh dáúu chè âënh thay cho mu vng SPY(S,marksize) dng kêch thỉåïc âạnh dáúu chè âënh thay cho kêch thỉåïc phủ thüc vo kêch thỉåïc hçnh nh v kêch thỉåïc ma tráûn SPY(S,color,marksize) v SPY(S,marksize,color) l cho phẹp GPLOT V âäư thë theo “l thuút âäư thë ” GPLOT(A,xy) v âäư thë chè âënh båíi A v xy. Mäüt âäư thë, G, gäưm mäütì táûp cạc nụt (âènh) âỉåüc âạnh säú tỉì 1 âãún n, v mäüt táûp cạc cung, hồûc cảnh, näúi cạc âènh lải. Âãø v âäư thë G, cáưn 2 ma tráûn. Ma tráûn kãư, A, cọ a(i,j) khạc 0 nãúu v chè nãúu âènh i âỉåüc näúi våïi âènh j. Mng ta âäü, xy, l mäüt ma tráûn cåỵ nx2 våïi vë trê cho âènh i tải dng thỉï i xy(i,:) = [x(i) y(i)] GPLOT(A,xy,lc) dng kiãøu âỉåìng v mu thay cho ngáưm âënh l 'r-'. Vê dủ, lc = 'g:' . Xem PLOT [X,Y] = GPLOT(A,xy) tr vãư cạc vectå âạnh dáúu NaN X v Y m khäng v. Cạc vectå ny cọ thãø dng âãø phạt sinh âäư thë sau ny nãúu mún Cạc thût toạn sàõp xãúp lải COLMMD Báûc täúi thiãøu vãư cäüt p = COLMMD(S). Báûc täúi thiãøu vãư cäüt ca S. Âäúi våïi mäüt ma tráûn khäng âäúi xỉïng S, hm ny tr vãư mäüt cäüt hoạn vë p âãø S(:,p) cọ cạc nhán tỉí LU thỉa hån S SYMMMD Báûc âäúi xỉïng täúi thiãøu p = SYMMMD(S), âäúi våïi mäüt ma tráûn xạc âënh dỉång âäúi xỉïng S thç tr vãư mäüt hoạn vë âãø S(p,p) cọ nhán tỉí Cholesky thỉa hån S. Âäi khi SYMMMD cng lm viãûc täút âäúi våïi cạc ma tráûn âäúi xỉïng khäng xạc âënh SYMRCM Âo thỉï tỉû Cuthill-McKee p = SYMRCM(S) tr vãư mäüt hoạn vë p âãø S(p,p) cọ profile nh hån S. Hm ny sàõp trỉåïc täút cho viãûc tạch nhán tỉí LU hồûc Cholesky âäúi våïi cạc ma tráûn nháûn âỉåüc tỉì cạc bi toạn di v gáưy ("long, skinny"). Nọ lm viãûc cho c hai loải S âäúi xỉïng v khäng âäúi xỉïng COLPERM COLPERM Bác cạc cäüt dỉûa vo cạch âãúm cạc pháưn tỉí khạc 0 Phụ lục-Lệnh và hàm 229 Phan Thanh Tao - 2004 p = COLPERM(S) phạt sinh mäüt hoạn vë âãø sàõp lải cạc cäüt ca ma tráûn S thỉa (hồûc âáưy â) theo thỉï tỉû khäng tàng ca viãûc âãúm cạc pháưn tỉí khạc 0. Thỉåìng sàõp trỉåïc viãûc tạch nhán tỉí LU: lu(S(:,p)). Khäng phi täút nháút trong thỉûc hnh thäng thỉåìng, nhỉng tênh trãn mạy nhanh v thỉûc hiãûn cäng viãûc khạ âẻp RANDPERM RANDPERM Vectå hoạn vë ngáùu nhiãn RANDPERM(n) l mäüt hoạn vë ngáùu nhiãn ca cạc säú ngun tỉì 1 âãún n. Vê dủ, RANDPERM(6) cọ thãø l [2 4 5 6 1 3]. Lỉu ràòng RANDPERM gi hm RAND v do âọ thay âäøi giạ trë khåíi tảo ngáùu nhiãn ca hm RAND DMPERM Tạch Dulmage-Mendelsohn ca ma tráûn A p = DMPERM(A) tr vãư mäüt ph håüp täúi âa; nãúu A cọ hảng cäüt âáưy â thç A(p,:) vng våïi âỉåìng chẹo khạc 0 [p,q,r,s] = DMPERM(A) tr vãư cạc hoạn vë âãø âàût A(p,q) vo dảng khäúi tam giạc trãn: Âäúi våïi A vng hảng âáưy â, A(p,q) cọ âỉåìng chẹo khạc 0 v thnh pháưn Hall mảnh thỉï i l khäúi thỉï i (bi,bi) ca A(p,q), våïi bi = r(i):r(i+1)-1. Våïi A chỉỵ nháût täøng quạt, thnh pháưn Hall mảnh thỉï i l khäúi (r(i):r(i+1)-1, s(i):s(i+1)-1) Chøn, säú âiãưu kiãûn, v hảng NORMEST NORMEST Ỉåïc lỉåüng chøn 2 (2-norm) NORMEST(S) l mäüt ỉåïc lỉåüng chøn-2 ca ma tráûn S NORMEST(S,tol) dng sai säú tỉång âäúi tol thay cho 1.e-6 [nrm,cnt] = NORMEST(S) cng cho säú láưn dng làûp ly thỉìa CONDEST CONDEST Ỉåïc lỉåüng säú âiãưu kiãûn chøn-1. Cạch sỉía âäøi ca Higham tỉì phỉång phạp ca Hager [C, V] = CONDEST(A) tênh giåïi hản dỉåïi C cho säú âiãưu kiãûn chøn-1 ca A, v vectå V âãø NORM(A*V)=NORM(A)*NORM(V)/C. V l vectå xáúp xè 0 nãúu C låïn SPRANK Hảng cáúu trục thỉa r = SPRANK(A) hảng vãư cáúu trục ca ma tráûn thỉa A. Cn gi l lưng cỉûc âải, phán cäng cỉûc âải, v kêch thỉåïc ca mäüt ph håüp cỉûc âải trong âäư thë phán âäi ca A. Ln ln cọ sprank(A) >= Phụ lục-Lệnh và hàm 230 Phan Thanh Tao - 2004 rank(A), v trong säú hc sprank(A) == rank(sprandn(A)) våïi säú hc xạc sút Cạc thao tạc trãn cáy TREELAYOUT TREELAYOUT Trçnh by mäüt cáy hồûc rỉìng [x,y,h,s] = treelayout(parent,post) våïi parent l vectå cạc nụt cha, våïi 0 cho gäúc. post l hoạn vë háûu tỉû trãn cạc nụt ca cáy (nãúu b qua post thç tênh nọ åí âáy). x v y l cạc vectå gäưm cạc ta âäü trong hçnh vng âån vë m åí âọ trçnh by cạc nụt ca cáy âãø tảo ra mäüt hçnh nh âẻp màõt. Cạc âäúi säú ty chn, h l âäü cao ca cáy v s l säú nụt con ca nụt gäúc TREEPLOT TREEPLOT V hçnh nh ca mäüt cáy TREEPLOT(p,c,d) p l vectå cạc âiãøm cha, våïi p(i) == 0 cho gäúc. c l mu v k tỉû cho cạc nụt, hồûc c='' âãø khäng v nụt. d l mu v k tỉû cho cạc cảnh, hồûc d='' âãø khäng v cảnh. c hồûc d cọ thãø b qua, v cạc giạ trë ngáưm âënh håüp l âỉåüc sỉí dủng ETREE Cáy khỉí ca mäüt ma tráûn p = etree(A) tr vãư mäüt cáy khỉí âäúi våïi mäüt ma tráûn vng âäúi xỉïng cọ tam giạc trãn l tam giạc trãn ca A. p(j) l cha ca cäüt j trãn cáy, hồûc 0 nãúu j l gäúc p = etree(A,'col') tr vãư cáy khỉí ca A'*A p = etree(A,'sym') giäúng p = etree(A) [p,q] = etree( ) cng tr vãư hoạn vë háûu tỉû q trãn cáy ETREEPLOT ETREEPLOT V mäüt cáy khỉí etreeplot(A): V cáy khỉí ca A (hồûc A+A', nãúu A khäng âäúi xỉïng) etreeplot(A,c,d): Xem treeplot cho cạc tham säú ty chn c v d Phụ lục-Lệnh và hàm 231 Phan Thanh Tao - 2004 Cạc thao tạc linh tinh SYMBFACT SYMBFACT Phán têch nhán tỉí Symbol count = SYMBFACT(A) tr vãư vectå gäưm säú âãúm dng ca nhán tỉí tam giạc trãn nhán tỉí Cholesky ca mäüt ma tráûn âäúi xỉïng cọ tam giạc trãn l tam giạc trãn ca A, gi sỉí b qua trong tiãún trçnh phán têch thỉìa säú. Phủc vủ ny nhanh hån chol(A) count = SYMBFACT(A,'col') phán têch A'*A (m khäng tảo tảo nọ mäüt cạch r rng) count = SYMBFACT(A,'sym') giäúng nhỉ p = symbfact(A). Cọ mäüt säú giạ trë tr vãư ty chn: [count,h,parent,post,R] = symbfact( ) cng tr vãư âäü cao ca cáy khỉí, chênh cáy khỉí, mäüt hoạn vë ca cáy khỉí, v ma tráûn 0-1 R cọ cáúu trục ca chol(A) SPPARMS SPPARMS Âàût cạc tham säú cho cạc phủc vủ ma tráûn thỉa SPPARMS('key',value) âàût mäüt hồûc nhiãưu tham säú "tunable" dng cho cạc toạn tỉí phỉång trçnh tuún tênh thỉa, l \ v /, v cạc sàõp xãúp báûc âäúi xỉïng täúi thiãøu, COLMMD v SYMMMD SPPARMS, in ra mä t cạc ci âàût hiãûn thåìi. Nãúu khäng cọ âäúi säú nháûp thç values = SPPARMS tr vãư mäüt vectå cọ cạc thnh pháưn cho trong cạc ci âàût hiãûn thåìi [keys,values] = SPPARMS tr vãư vectå âọ, v cng tr vãư mäüt ma tráûn k tỉû cọ cạc dng l cạc tỉì khọa cho cạc tham säú SPPARMS(values), khäng cọ âäúi säú xút, âàût táút c cạc tham säú vo cạc giạ trë chè âënh båíi vectå âäúi säú value = SPPARMS('key') tr vãư ci âàût hiãûn thåìi ca mäüt tham säú SPPARMS('default') âàût táút c cạc tham säú vãư cạc ci âàût màûc âënh ca nọ SPPARMS('tight') âàût cạc tham säú báûc täúi thiãøu vãư cạc ci âàût chàût ch ca chụng, chụng cọ thãø âáùn âãún cạc báûc êt hån báûc thay thãú, nhỉng lm cho cạc hm thỉûc hiãûn nhiãưu láưn hån. Cạc tham säú våïi cạc giạ trë ngáưm âënh v cạc giạ trë chàût ch l: tỉì khọa ngáưm âënh chàût values(1) 'spumoni' 0 values(2) 'thr_rel' 1.1 1.0 values(3) 'thr_abs' 1.0 0.0 values(4) 'exact_d' 0 1 . ones(n,1); A = spdiags([e -2 *e e], -1 :1, n, n) Lãûnh ny âäøi ma tráûn A thnh ma tráûn kiãøm tra Wilkinson (xem WILKINSON(n)) A = spdiags(abs (-( n-1)/2:(n-1) /2)& apos;,0,A) Cúi cng, lãûnh. r(i):r(i+1 )-1 . Våïi A chỉỵ nháût täøng quạt, thnh pháưn Hall mảnh thỉï i l khäúi (r(i):r(i+1 )-1 , s(i):s(i+1 )-1 ) Chøn, säú âiãưu kiãûn, v hảng NORMEST NORMEST Ỉåïc lỉåüng chøn 2 (2-norm) . 0 33 0 41 0 0 44 Phụ lục-Lệnh và hàm 225 Phan Thanh Tao - 2004 0 52 0 0 0 0 63 0 0 0 0 74] cọ m = 7, n = 4 v p = 3 Lãûnh [B,d] = spdiags(A) cho d = [-3 0 2]' v B = [ 41