Phụ lục-Lệnh và hàm 216 Phan Thanh Tao - 2004 [A,COUNT] = FSCANF(FID,FORMAT,SIZE) âc dỉỵ liãûu tỉì tãûp chè âënh båíi danh hiãûu tãûp FID, chuøn sang chùi chè âënh FORMAT, v tr vãư ma tráûn A. COUNT l âäúi säú xút ty chn âãø tr vãư säú pháưn tỉí âc thnh cäng FID l mäüt säú ngun danh hiãûu tãûp nháûn âỉåüc tỉì FOPEN. SIZE l ty chn; nọ âàût mäüt giåïi hản vo säú pháưn tỉí cọ thãø âỉåüc âc tỉì tãûp; nãúu khäng chè âënh thç xem nhỉ ton bäü tãûp; nãúu cọ chè âënh thç cạc âãư mủc håüp l l: N âc háưu hãút N pháưn tỉí vo mäüt vectå cäüt inf âc âãún hãút tãûp [M,N] âc M * N pháưn tỉí láúp âáưy êt nháút mäüt ma tráûn cåỵ MxN, theo thỉï tỉû cäüt. N cọ thãø l inf, nhỉng khäng l M. Nãúu ma tráûn tr vãư A tỉì cạch chè dng chuøn âäøi k tỉû v SIZE khäng thüc dảng [M,N] thç tr vãư mäüt vectå cäüt. FORMAT l mäüt chùi chỉïa cạc chè âënh chuøn âäøi ca ngän ngỉỵ C. Cạc chè âënh chuøn âäøi gäưm k tỉû %, lỉûa chn “*” b qua viãûc gạn v trỉåìng âäü räüng, v cạc k tỉû chuøn kiãøu d, i, o, u, x, e, f, g, s, c, v [. . .]. Xem giạo trçnh C vãư cạc k tỉû chuøn kiãøu. Nãúu mäüt k tỉû chuøn âäøi âỉåüc dng âãø âc mäüt pháưn tỉí thç cọ thãø lm cho mäüt säú pháưn tỉí ma tráûn ca MATLAB âỉåüc dng, mäùi pháưn tỉí giỉỵ mäüt k tỉû . Viãûc träün k tỉû v cạc chè âënh chuøn kiãøu säú s lm cho ma tráûn kãút qu l ma tráûn säú v cạc k tỉû âc vo nhỉ giạ trë ASCII ca chụng, mäùi k tỉû trãn mäüt pháưn tỉí ca ma tráûn FSCANF khạc våïi hm trng tãn ca nọ trong C, âiãưu quan trng tỉång ỉïng l nọ âỉåüc “vectå họa" nhàòm trí vãư mäüt âäúi säú ma tráûn. Chùi FORMAT âỉåüc dng lải qua tãûp cho âãún khi hãút tãûp hồûc täøng säú dỉỵ liãûu chè âënh båíi SIZE âỉåüc âc vo. Vê dủ: S = fscanf(fid,'%s') âc (v tr vãư ) mäüt chùi k tỉû A = fscanf(fid,'%5d') âc säú ngun tháûp phán 5-chỉỵ säú FPRINTF FPRINTF Ghi dỉỵ liãûu cọ dảng thỉïc vo tãûp COUNT = FPRINTF(FID,FORMAT,A, ) âënh dảng dỉỵ liãûu trong ma tráûn A (v trong mi ma tráûn âäiú säú thãm vo), dỉåïi âiãưu khiãøn ca chùi chè âënh FORMAT, v ghi nọ vo tãûp cọ dảnh hiãûu FID. COUNT l âäúi säú xút ty chn âãø tr vãư säú byte ghi thnh cäng. FID l mäüt säú ngun danh hiãûu tãûp nháûn âỉåüc FOPEN. Nọ cng cọ thãø l 1 cho xút chøn (mn hçnh) hồûc 2 cho läùi chøn. FORMAT l chùi chỉïa cạc chè âënh chuøn kiãøu ca C. Cạc chè âënh chuøn âäøi gäưm k tỉû %, , cạc cåì ty chn, cạc trỉåìng âäü räüng v säú cạc säú tháûp phán, chè âënh kiãøu con, v cạc k tỉû chuøn Phụ lục-Lệnh và hàm 217 Phan Thanh Tao - 2004 kiãøu d, i, o, u, x, X, f, e, E, g, G, c, v s. Xem giạo trçnh C âãø biãút thãm chi tiãút FPRINTF nhỉ ANSI C våïi cạc loải trỉì v cạc måí räüng. Bao gäưm: 1. Nãúu säú thỉûc kẹp ca MATLAB khäng chuøn chênh xạc sang kiãøu dỉỵ liãûu chè âënh trong k tỉû chuøn kiãøu thç FORMAT “e ” âỉåüc dng. Phi chuøn r rng cạc giạ trë khäng ngun ca MATLAB sang cạc giạ trë ngun nãúu cọ âënh dng chè âënh chuøn kiãøu ngun nhỉ “ d ” v láúy cạch xỉí l ca ANSI C 2. Cạc chè âënh kiãøu con khäng chøn sau âỉåüc cung cáúp cho cạc k tỉû chuøn kiãøu o, u, x, v X t - Kiãøu dỉỵ liãûu cå såí ca C l float khạc våïi säú ngun khäng dáúu b - Kiãøu dỉỵ liãûu cå såí ca C l double khạc våïi säú ngun khäng dáúu Vê dủ, âãø in ra mäüt giạ trë double cå säú hex thç dng FORMAT nhỉ '%bx' FPRINTF cng khạc våïi hm cng tãn ca nọ trong C - quan trng l " vectå họa " khi A khäng phi l âải lỉåüng vä hỉåïng. Chùi FORMAT âỉåüc dng lải qua cạc pháưn tỉí ca A (tỉìng cäüt) cho âãún khi táút c cạc pháưn tỉí âỉåüc dng hãút. Räưi nọ âỉåüc dng lải theo cng cạch, khäng khåíi tảo lải, qua mi âäúi säú ma tráûn thãm vo. Vê dủ, cạc lãûnh x = 0:.1:1; y = [x; exp(x)]; fid = fopen('exp.txt','w'); fprintf(fid,'%6.2f %12.8f\n',y); tảo måïi mäüt tãûp vàn bn chỉïa bng ngàõn cạc giạ trë ca hm m cå säú tỉû nhiãn: 0.00 1.00000000 0.10 1.10517092 1.00 2.71828183 FGETL Tr vãư dng tiãúp theo ca tãûp nhỉ mäüt chùi FGETL(FID) tr vãư dng tiãúp theo ca mäüt tãûp våïi danh hiãûu tãûp FID nhỉ mäüt chùi MATLAB. Tr vãư m khäng âỉa vo k tỉû sang dng. Dng FGETS() âãø láúy dng tiãúp theo cọ âỉa vo k tỉû sang dng. Nãúu âụng kãút thục tãûp thç tr vãư -1 QUAN TRNG: Hy lỉu ràòng hm ny cọ chè dng våïi tãûp vàn bn. Nãúu båíi nháưm láùn, âc mäüt tãûp "nhë phán" m khäng cọ k tỉû sang dng thç phủc vủ ny cọ thãø täún nhiãưu thåìi gian våïi tãûp låïn. Vê dủ: (tỉång âỉång lãûnh 'type fgetl.m') fid=fopen('fgetl.m'); while 1 line = fgetl(fid); if ~isstr(line), break, end disp(line) Phụ lục-Lệnh và hàm 218 Phan Thanh Tao - 2004 end fclose(fid); FGETS Tr vãư dng tiãúp theo ca tãûp nhỉ mäüt chùi FGETS(FID) tr vãư dng tiãúp theo ca mäüt tãûp våïi danh hiãûu tãûp fid l mäüt chùi MATLAB. Cọ âỉa vo k tỉû sang dng. Dng FGETL() âãø láúy dng tiãúp theo m khäng âỉa vo k tỉû sang dng. Nãúu âụng kãút thục tãûp thç tr vãư -1 QUAN TRNG: Hy lỉu ràòng hm ny cọ chè dng våïi tãûp vàn bn. Nãúu båíi nháưm láùn, âc mäüt tãûp "nhë phán" m khäng cọ k tỉû sang dng thç phủc vủ ny cọ thãø täún nhiãưu thåìi gian våïi tãûp låïn Vë trê tãûp FERROR Hi cạc läùi trong nháûp/xút tãûp MESSAGE = FERROR(FID,'clear') tr vãư thäng bạo läùi vo/ra gáưn nháút våïi tãûp chè âënh. Chùi 'clear' l ty chn. Nãúu cọ, thç xọa läùi biãøu hiãûn cho tãûp chè âënh [MESSAGE, ERRNUM] = FERROR(FID) cng tr vãư säú läùi. FID l mäüt säú ngun danh hiãûu tãûp nháûn âỉåüc tỉìì FOPEN, hồûc 0 cho nháûp chøn, 1 cho xút chøn hồûc 2 cho läùi chøn FEOF Kiãøm tra hãút tãûp FEOF(FID) kiãøm tra biãøu hiãûn hãút tãûp cho tãûp våïi danh hiãûu tãûp l FID FEOF(FID) tr vãư 1 nãúu biãøu hiãûn hãút tãûp âỉåüc âàût, hồûc 0 nãúu khäng âàût FSEEK Âäøi biãøu hiãûn vë trê trong mäüt tãûp STATUS = FSEEK(FID, offset, origin) âàût lải vë trê tãûp trong tãûp chè âënh vo säú byte offset tỉång ỉïng våïi origin chè âënh. FID l mäüt säú ngun danh hiãûu tãûp nháûn âỉåüc tỉìì FOPEN. Cạc giạ trë offset âỉåüc thäng dëch nhỉ sau: > 0 : Di chuøn vãư phêa cúi tãûp = 0 : Khäng thay âäøi vë trê < 0 : Di chuøn vãư phêa âáưu tãûp Cạc giạ trë origin âỉåüc thäng dëch nhỉ sau: 'bof' hồûc -1 : Âáưu tãûp 'cof' hồûc 0 : Vë trê hiãûn thåìi trong tãûp 'eof' hồûc 1 : Cúi tãûp STATUS = 0 nãúu thnh cäng vì -1 nãúu bë läùi Vê dủ: fseek(fid,0,-1) "tua lải" tãûp (âàût vë trê lải åí âáưu tãûp) Ph lc-Lnh v hm 219 Phan Thanh Tao - 2004 FTELL Tỗm vở trờ trong mọỹt tóỷp POSITION = FTELL(FID) traớ vóử vở trờ cuớa trong tóỷp chố õởnh. Position bióứu hióỷn theo õồn vở byte tờnh tổỡ õỏửu tóỷp. Nóỳu -1 õổồỹc traớ vóử, thỗ bióứu hióỷn khọng thaỡnh cọng; duỡng FERROR õóứ xaùc õởnh traỷng thaùi lọựi. FID laỡ mọỹt sọỳ nguyón danh hióỷu tóỷp nhỏỷn õổồỹc tổỡ FOPEN, hoỷc 0 cho nhỏỷp chuỏứn, 1 cho xuỏỳt chuỏứn hoỷc 2 cho lọựi chuỏứn Phụ lục-Lệnh và hàm 220 Phan Thanh Tao - 2004 FREWIND FREWIND tua lải mäüt tãûp âang måí FREWIND(FID) âàût con tr tãûp vo âáưu tãûp våïi danh hiãûu tãûp l fid Khuún cạo: Tua lải mäüt danh hiãûu tãûp fid våïi mäüt thiãút bë bàng tỉì cọ thãø khäng khäng lm viãûc, màûc d khäng phạt sinh läùi! Chuøn âäøi chùi SPRINTF SPRINTF Ghi dỉỵ liãûu cọ dảng thỉïc vo mäüt chùi [S,ERRMSG] = SPRINTF(FORMAT,A, ) âënh dảng dỉỵ liãûu trong ma tráûn A (v trong cạc âäúi säú ma tráûn thãm vo), dỉåïi âiãưu khiãøn ca chùi chè âënh FORMAT, v tr vãư nọ trong biãún S våïi dảng chùi MATLAB. ERRMSG l âäúi säú xút ty chn âãø tr vãư mäüt chùi thäng bạo läùi nãúu xy ra läùi hồûc mäüt ma tráûn räùng nãúu khäng läùi. SPRINTF giäúng nhỉ FPRINTF ngoải trỉì nọ tr vãư dỉỵ liãûu trong mäüt biãún chùi MATLAB khạc våïi ghi vo tãûp. FORMAT l mäüt chùi chỉïa cạc chè âënh chuøn kiãøu ca C. Cạc chè âënh chuøn kiãøu gäưm k tỉû %, cạc cåì, cạc trỉåìng âäü räüng v säú chỉỵ säú tháûp phán, chè âënh kiãøu con, v k tỉû chuøn kiãøu d, i, o, u, x, X, f, e, E, g, G, c, v s. Xem giạo trçnh C âãø biãút thãm chi tiãút. SPRINTF nhỉ trong ANSI C våïi mt säú ngoải lãû v måí räüng. Bao gäưm: 1. Nãúu säú thỉûc kẹp ca MATLAB khäng chuøn chênh xạc sang kiãøu dỉỵ liãûu chè âënh trong k tỉû chuøn kiãøu thç FORMAT “e” âỉåüc dng. Bản phi chuøn r rng cạc giạ trë khäng ngun ca MATLAB sang cạc giạ trë ngun nãúu bản cọ âënh dng chè âënh chuøn kiãøu ngun nhỉ “ d ” v láúy cạch xỉí l ca ANSI C 2. Cạc chè âënh kiãøu con khäng chøn sau âỉåüc cung cáúp cho cạc k tỉû chuøn kiãøu o, u, x, v X t - Kiãøu dỉỵ liãûu cå såí ca C l float khạc våïi säú ngun khäng dáúu b - Kiãøu dỉỵ liãûu cå såí ca C l double khạc våïi säú ngun khäng dáúu Vê dủ, âãø in ra mäüt giạ trë double cå säú hex thç dng FORMAT nhỉ '%bx' SPRINTF cng khạc våïi hm cng tãn ca nọ trong C - quan trng l " vectå họa " khi A khäng phi l âải lỉåüng vä hỉåïng. Chùi FORMAT âỉåüc dng lải qua cạc pháưn tỉí ca A (tỉìng cäüt) cho âãún khi táút c cạc pháưn tỉí âỉåüc dng hãút. Räưi nọ âỉåüc dng lải theo cng cạch, khäng khåíi tảo lải, qua mi âäúi säú ma tráûn thãm vo. Vê dủ, cạc lãûnh S = sprintf('rho is %5.3f',(1+sqrt(5))/2) cho ra chùi S = 'rho is 1.618' Phụ lục-Lệnh và hàm 221 Phan Thanh Tao - 2004 SSCANF Âc chùi dỉåïi âiãưu khiãøn cọ dảng thỉïc [A,COUNT,ERRMSG,NEXTINDEX] = SSCANF(S,FORMAT,SIZE) âc dỉỵ liãûu tỉì biãún chùi MATLAB l S, chuøn sang chùi chè âënh FORMAT, v tr vãư trong ma tráûn A. COUNT l mäüt âäúi säú xút ty chn âãø tr vãư säú pháưn tỉ âc thnh cäng ERRMSG l mäüt âäúi säú xút ty chn âãø tr vãư mäüt chùi thäng bạo läùi nãúu cọ läùi hồûc mäüt ma tráûn räùng nãúu khäng läùi. NEXTINDEX l mäüt âäúi säú xút ty chn chè âënh mäüt hay nhiãưu säú k tỉû â quẹt trong S. SSCANF giäúng FSCANF ngoải trỉì nọ âc dỉỵ liãûu tỉì mäüt biãún chùi MATLAB khạc våïi âc tỉì mäüt tãûp. SIZE l ty chn; nọ âàût mäüt giåïi hản vo pháưn tỉ cọ thãø quẹt tỉì chùi; nãúu khäng chè âënh, thç xem nhỉ ton bäü chùi; nãúu cọ chè âënh, thç cạc âãư mủc håüp l l: N âc N pháưn tỉí vo mäüt vectå cäüt inf âc âãún cúi chùi [M,N] âc M * N pháưn tỉí láúp âáưy êt nháút mäüt ma tráûn cåỵ MxN, theo cäüt. N cọ thãø l inf, nhỉng khäng l M. Nãúu ma tráûn kãút qu A chè tỉì viãûc dng k tỉû chuøn kiãøu v SIZE khäng cọ dảng [M,N] thç mäüt vectå dng âỉåüc tr vãư. FORMAT l mäüt chùi chỉïa cạc chè âënh chuøn âäøi ca ngän ngỉỵ C. Cạc chè âënh chuøn âäøi gäưm k tỉû %, lỉûa chn “ * ” b qua viãûc gạn v trỉåìng âäü räüng, v cạc k tỉû chuøn kiãøu d, i, o, u, x, e, f, g, s, c, v [. . .]. Xem giạo trçnh C vãư cạc k tỉû chuøn kiãøu. Nãúu mäüt k tỉû chuøn âäøi âỉåüc dng âãø âc mäüt pháưn tỉí thç cọ thãø lm cho mäüt säú pháưn tỉí ma tráûn ca MATLAB âỉåüc dng, mäùi pháưn tỉí giỉỵ mäüt k tỉû . Viãûc träün k tỉû v cạc chè âënh chuøn kiãøu säú s lm cho ma tráûn kãút qu l ma tráûn säú v cạc k tỉû âc vo nhỉ giạ trë ASCII ca chụng, mäùi k tỉû trãn mäüt pháưn tỉí ca ma tráûn Viãûc quẹt âãún cúi chùi xy ra khi NEXTINDEX låïn hån kêch thỉåïc ca S SSCANF khạc våïi hm trng tãn ca nọ trong C, âiãưu quan trng tỉång ỉïng l nọ âỉåüc “vectå họa" nhàòm trí vãư mäüt âäúi säú ma tráûn. Chùi FORMAT âỉåüc dng lải qua tãûp cho âãún khi hãút tãûp hồûc täøng säú dỉỵ liãûu chè âënh båíi SIZE âỉåüc chuøn sang. Vê dủ, cạc lãûnh: S = '2.7183 3.1416'; A = sscanf(S,'%f') tảo måïi mäüt vectå hai pháưn tỉí chỉïa giạ trë xáúp xè ca säú e v pi Cạc ma tráûn thỉa så cáúp SPEYE Ma tráûn thỉa âån vë Ph lc-Lnh v hm 222 Phan Thanh Tao - 2004 SPEYE(M,N) taỷo mọỹt ma trỏỷn thổa cồợ MxN vồùi caùc sọỳ 1 trón õổồỡng cheùo chờnh SPEYE(N) laỡ caùch goỹn cuớa SPEYE(N,N) SPEYE(SIZE(A)) laỡ mọỹt caùch giaớm khọng gian cuớa SPARSE(EYE(SIZE(A))) Phụ lục-Lệnh và hàm 223 Phan Thanh Tao - 2004 SPRANDN Cạc ma tráûn thỉa ngáùu nhiãn R = SPRANDN(S) cọ cng cáúu trục thỉa nhỉ S, nhỉng cạc pháưn tỉí âỉåüc phán bäú ngáùu nhiãn chøn R = SPRANDN(m,n,density) l ma tráûn thỉa cåỵ mxn, våïi cạc pháưn tỉí khạc khäng âỉåüc phán bäú chøn khong density*m*n R = SPRANDN(m,n,density,rc) cng cọ säú âiãưu kiãûn tỉång häù gáưn bàòng rc. R âỉåüc xáy dỉûng tỉì täøng cạc ma tráûn hảng bàòng 1. Nãúu rc l mäüt vectå âäü di lr <= min(m,n), thç R cọ lr giạ trë k dë ca nọ l rc, táút c cạc pháưn tỉí khạc bàòng 0. Trong trỉåìng håüp ny, R âỉåüc phạt sinh bàòng cạch quay phàóng ngáùu nhiãn ạp dủng cho mäüt ma tráûn chẹo våïi cạc giạ trë k dë cho trỉåïc. Nọ cọ cạch phán phäúi låïn cáúu trục topo v âải säú SPRANDSYM SPRANDSYM Cạc ma tráûn thỉa ngáùu nhiãn âäúi xỉïng R = SPRANDSYM(S) l mäüt ma tráûn thỉa ngáùu nhiãn âäúi xỉïng cọ tam giạc dỉåïi v âỉåìng chẹo cng cáọ trục nhỉ S. Cạc pháưn tỉí âỉåüc phán bäú chøn, våïi trung bçnh 0 v phỉång sai 1 R = SPRANDSYM(n,density) l mäüt ma tráûn vng thỉa âäúi xỉïng ngáùu nhiãn cáúp n våïi cạc pháưn tỉí khạc khäng khong density*n*n; mäùi pháưn tỉí l täøng ca mäüt hồûc nhiãưu cạc máùu phán bäú ngáùu nhiãn chøn R = SPRANDSYM(n,density,rcond) cng cọ säú âiãưu kiãûn tỉång häù bàòng rcond. Viãûc phán bäú cạc pháưn tỉí l khäng âäưng bäü; nọ l âäúi xỉïng thä qua 0; táút c trong âoản [-1,1]. Nãúu rcond l 1 vectå âäü di n, thç R cọ cạc giạ trë riãng l rcond. Do âọ, nãúu rcond l mäüt vectå dỉång (khäng ám) thç R s xạc âënh dỉång (khäng ám). Trong trỉåìng håüp ny, R âỉåüc phạt sinh bàòng cạch quay Jacobi ạp dủng va ma tráûn chẹo våïi cạc giạ trë riãng hồûc säú âiãưu kiãûn cho trỉåïc. Nọ cọ cạch phán phäúi låïn cáúu trục topo v âải säú R = SPRANDSYM(n, density, rcond, kind) l mäüt xạc âënh dỉång. Nãúu kind = 1 thç R âỉåüc phạt sinh bàòng phẹp quay mäüt ma tráûn chẹo xạc âënh dỉång. R cọ âụng säú âiãưu kiãûn mong mún. Nãúu kind = 2 thç R l täøng dëch chuøn cạc têch ngoải lai. R chè cọ säú âiãưu kiãûn mong mún nhỉng cáúu trục nh hån. Nãúu R = SPRANDSYM(S, density, rcond, 3), thç R cọ cng cáúu trục nhỉ ma tráûn S v säú âiãưu kiãûn xáúp xè 1/rcond, âäúi säú density âỉåüc b qua SPDIAGS SPDIAGS Trêch ra v tảo måïi cạc ma tráûn di bàng v ma tráûn chẹo thỉa SPDIAGS, l täøng quạt họa hm gàõn liãưn "diag", xỉí l 3 loải ma tráûn , cạc täø håüp khạc nhau, cng nhỉ nháûp v xút. A l ma tráûn cåỵ mxn, thỉåìng thỉa (nhỉng khäng cáưn thiãút), våïi cạc pháưn . fprintf(fid,'%6.2f %12.8f ',y); tảo måïi mäüt tãûp vàn bn chỉïa bng ngàõn cạc giạ trë ca hm m cå säú tỉû nhiãn: 0.00 1.00000000 0.10 1.10517092 1.00 2.7 182 8 183 FGETL Tr vãư. åí âáưu tãûp) Ph lc-Lnh v hm 219 Phan Thanh Tao - 2004 FTELL Tỗm vở trờ trong mọỹt tóỷp POSITION = FTELL(FID) traớ vóử vở trờ cuớa trong tóỷp chố õởnh. Position bióứu hióỷn theo õồn. S = sprintf('rho is %5.3f',(1+sqrt(5)) /2) cho ra chùi S = 'rho is 1.6 18& apos; Phụ lục-Lệnh và hàm 221 Phan Thanh Tao - 2004 SSCANF Âc chùi dỉåïi âiãưu khiãøn cọ dảng