các phép toán với MảNg Tất cả mọi sự tính toán đều duy trì một điểm là có sử dụng đến các số đơn, gọi là scalars. Phép toán có liên quan đến scalars là các phép toán cơ bản, nh-ng một lúc nào đó, phép toán phải lặp lại nhiều lần khi tính trên nhiều số. Để giải quyết vấn đề này, MATLAB định nghĩa thao tác trên mảng dữ liệu. 6.1 Mảng đơn Giả sử ta xét hàm y=sin(x) trong một nửa chu kỳ ( p = x = 0 ) trong khoảng này số điểm giá...
24 chơng phép toán với MảNg Tất tính toán trì điểm có sử dụng đến số đơn, gọi scalars Phép toán có liên quan đến scalars phép toán bản, nhng lúc đó, phép toán phải lặp lại nhiều lần tính nhiều số Để giải vấn đề này, MATLAB định nghĩa thao tác mảng liệu 6.1 Mảng đơn Giả sử ta xÐt hµm y=sin(x) mét nưa chu kú ( x ) khoảng số điểm giá trị x vô tận, nhng ta xét điểm cách khoảng giá trị 0.1 nh số giá trị x đếm đợc Từ ta có mảng giá trị x x= 0, 0.1, 0.2, , Nếu ta dùng máy tính kỹ thuật để tính ta đợc tơng ứng giá trị y, từ ®ã ta cã m¶ng cđa y x y 0 0.1π 0.31 0.2π 0.59 0.3π 0.81 0.4π 0.95 0.5π 1.0 0.6π 0.95 0.7π 0.81 0.8π 0.59 0.9π 0.31 π mảng x chứa phần tử x1, x2, , x11 mảng y chứa phần tử y1, y2, , y11 Trong MATLAB để toạ mảng đơn giản; ví dụ để tạo hai mảng ta đánh lệnh sau vào dấu nhắc MATLAB: >> x=[0 1*pi 2*pi 3*pi 4*pi 5*pi 6*pi 7*pi 8*pi 9*pi pi] x= Columns through 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 Columns through 11 2.1991 2.5133 2.8274 3.1416 >> y = sin(x) y= Columns through 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 Columns through 11 0.8090 0.5878 0.3090 0.0000 Kết ta đợc mảng y gồm phần tử tơng ứng sine phần tử x, MATLAB ngầm hiểu ta tính sine phần tử x Để tạo mảng, ta đặt phần tử mảng vào hai dấu ngoặc vuông "[ ]"; hai phần tử mảng dấu cách dấu phẩy "," 6.2 Địa mảng mảng x có hàng, 11 cột hay gọi vector hàng, mảng có độ dài 11 +) Để truy nhập đến phần tử mảng ta dùng số thứ tự phần tử mảng ví dụ x(1) phần tử thứ mảng, x(2) phần tử thứ hai mảng >> x(2) ans= % phần tử thứ mảng 25 0.3142 >> y(5) % phần tử thứ mảng ans= 0.9511 +) Để truy nhập đến nhiều phần tử mảng, ví dụ ta truy nhập từ phần tử thứ đến phần tử thứ năm mảng x: >> x(1:5) ans= 0.3142 0.6283 0.9425 1.2566 Truy nhập từ phần tử thứ đến phần tử cuối mảng y: >> y(7:end) ans= 0.9511 0.8090 0.5878 0.3090 0.0000 Truy nhËp tõ phÇn tư thø ba đến phần tử thứ mảng y: >> y(3:-1:1) ans= 0.5878 0.3090 ë vÝ dơ trªn phần tử thứ 3, phần tử đầu tiên, -1 giá trị cộng (vị trí phần tử sau vị trí phần tử trớc cộng với -1) Truy nhập đến phần tử khoảng từ phần tử thứ 2, đến phần tử thứ 7, vị trí phần tử sau vị trí phần tử trớc cộng với 2, mảng x: >> x(2:2:7) ans= 0.3142 0.9425 1.5708 Tạo mảng gồm phần tư thø 1, 2, 8, cđa m¶ng y: >> y([8 1]) ans= 0.8090 0.3090 0.5878 NÕu ta truy nhập vào phần tử mảng mà thứ tự phần tử tăng với 1, ta đánh lệnh: >> x(1:3) ans= 0.3142 0.6283 6.3 Cấu trúc mảng Với mảng có số lợng phần tử ta nhập vào trực tiếp, nhng với mảng có số lợng lớn phần tử ta dùng hai cách sau: +) Tạo mảng bắt đầu phần tử 0, sau b»ng phÇn tư tr−íc céng víi 0.1, phÇn tư ci 1, tất phần tử mảng đợc nh©n víi π: >> x= (0:0.1:1)*pi 26 x= Columns through 0.3142 0.6283 Columns through 11 2.1991 2.5133 0.9425 2.8274 1.2566 1.5708 1.8850 3.1416 +) Tạo mảng gồm phần tử x hàm linspace Cú pháp hàm nh sau: linspace(giá trị phần tử đầu, giá trị phần tử cuối, số phần tử) vÝ dô >> x = linspace(0,pi,11) x= Columns through 0.3142 0.6283 Columns through 11 2.1991 2.5133 0.9425 2.8274 1.2566 1.5708 1.8850 3.1416 C¸ch thø nhÊt gióp ta tạo mảng mà cần vào khoảng cách giá trị phần tử (không cần biết số phần tử), cách thứ hai ta cần vào số phần tử mảng (không cần biết khoảng cách giá trị phần tử) Ngoài mảng trên, MATLAB cung cấp mảng không gian theo logarithm hàm logspace Cú pháp hàm logspace nh sau: logspace(số mũ ®Çu, sè mị ci, sè phÇn tư) vÝ dơ: >> logspace(0,2,11) ans= Columns through 1.0000 1.5849 2.5119 3.9811 6.3096 10.0000 Columns though 11 25.1189 39.8107 63.0957 100.0000 15.8489 Tạo mảng, giá trị bắt đầu 100, giá trị cuối 100, chứa 11 giá trị Các mảng mảng mà phần tử đợc tạo lên theo quy luật định Nhng mảng đợc yêu cầu, không thuận tiện tạo phần tử phơng pháp trên, mẫu chuẩn để tạo mảng Tuy nhiên ta tạo mảng cách vào nhiỊu phÇn tư cïng mét lóc VÝ dơ >> a = 1:5,b = 1:2:9 a= b= >> c = [a b] 5 ví dụ ta đà tạo hai mảng thành phần a b sau tạo mảng c cách ghép hai mảng a b Ta tạo mảng nh sau: 27 >> d=[a(1:2:5) d= 1] 1 a mảng gồm phần tử [1 5], mảng d mảng gồm phần tử a ghép thêm phần tử [1 1] Tóm lại ta có bảng cấu trúc mảng bản: x=[ 2*pi sqrt(2) 2-3j ] x= first : last x= first : increment : last x= linspace(fist, last, n) x= logspace(first, last, n) Tạo vector hàng x chứa phần tử đặc biệt Tạo vector hàng x bắt đầu first, phần tử sau phần tử trớc cộng với 1, kết thúc phần tử có giá trị nhỏ last Tạo vector hàng x bắt đầu fist, giá trị cộng increment, kết thúc phần tử có giá trị nhỏ last Tạo vector hàng x bắt đầu first, kết thúc last, có n phần tử Tạo vector hàng không gian logarithm x bắt đầu 10first, kết thúc 10last, có n phần tử 6.4 Vector hàng vector cột Trong ví dụ trớc, mảng chứa mét hµng vµ nhiỊu cét, ng−êi ta th−êng gäi lµ vector hàng Ngoài ta có mảng vector cột, tức mảng có cột nhiều hàng, trờng hợp tất thao tác tính toán mảng nh không thay đổi Từ hàm tạo mảng minh hoạ phần trớc (tất tạo vector hàng), có nhiều cách để tạo vector cột Một cách trực tiếp để tạo vector cột vào phần tử mảng nh− vÝ dô sau: >> c = [1;2;3;4;5] c= Khác với trớc ta dùng dấu cách hay dấu phẩy để phân cách hai cột vector hàng Còn ví dụ ta dùng dấu chấm phẩy để phân cách hai hàng vector cột Một cách khác để tạo vector cột dùng hàm linspace, logspace, hay từ vector hàng, sau dùng phơng pháp chuyển vị MATLAB dùng toán tử chuyển vị ( ' ) để chuyển từ vector hàng thành vector cột ngợc lại Ví dụ tạo vector a vector b chuyển vị vector a, vector c chuyển vị cña vector b: >> a= 1:5 a= >> b= a' b= 3 28 >> c= b' c= Ngoài MATLAB sử dụng toán tử chuyển với dấu chấm đằng trớc ( ' ) ( toán tử chuyển vị chấm) Toán tử khác với toán tử chuyển vị ( ' ) phần tử mảng số phức, tức từ vector nguồn với phần tử số phức, toán tử ( ' ) tạo vector phức liên hợp chuyển vị, toán tử ( ' ) tạo vector chuyển vị Ví dụ sau làm rõ điều trên: >> c = a.' % Tạo vector c từ vector a toán tử chuyển vÞ chÊm c= >> d = a + i*a % T¹o vector sè phøc d tõ vector a d= Columns though 1.0000+1.0000i 2.0000+2.0000i 3.0000+3.0000i 4.0000+4.0000i Columns 5.0000+5.0000i >> e = d.' % Tạo vector e từ vector d toán tử chuyển vÞ chÊm ( ' ) e= 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i >> f = d' % T¹o vector f từ vector d toán tử chuyển vị ( ' ) f= 1.0000 - 1.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i 4.0000 - 4.0000i 5.0000 - 5.0000i ë trªn ta xét đến mảng có hàng hay cột ta xét trờng hợp có nhiều hàng nhiều cột, đợc gọi ma trận Ví dụ sau ma trận g có hai hàng vµ cét: >> g = [1 4;5 8] g= Trong ví dụ ta dùng dấu cách để vào phần tử hàng dấu chấm phẩy ( ; ) để tạo hai hàng; ta cịng cã thĨ t¹o ma trËn nh− sau: 29 >> g = [1 10 11 12] g= 10 11 12 Chó ý: Khi nhập vào ma trận hàng số phần tử phải không chơng trình bị báo lỗi nh ví dụ sau: >> h = [1 3;4 7] Numbers of elements in each row must be the same +) Phép toán mảng với số đơn Trong ví dụ trớc đà tạo mảng x cách nhân phần tử mảng với Các phép toán đơn giản khác mảng với số đơn phép cộng, phép trừ, phép nhân, phép chia mảng cho số ®ã b»ng c¸ch thùc hiƯn phÐp to¸n ®èi víi tõng phần tử mảng Ví dụ: >> g = [1 4; 8; 10 11 12]; >> -2 % Trừ phần tử mảng g ®i ans= -1 10 >> 2*g - % Nhân tất phần tử mảng g víi sau ®ã trõ ®i ans= 11 13 15 17 19 21 23 +) Phép toán mảng với mảng Thuật toán thực phép toán mảng đơn giản nh mà bị ràng buộc điều kiện khác nh hai mảng kích cỡ nh ta có phép toán sau: phép cộng, phép trừ, phép nhân, chia tơng ứng phần tử của hai mảng Ví dụ : >> g % Gọi lại mảng g g= 10 11 12 >> h = [1 1 1; 2 2; 3 3] % Tạo mảng h h= 1 1 2 2 3 3 >> h + g % Céng hai ma trận g h ( cộng tơng ứng phÇn tư cđa h víi g) ans= 30 10 12 13 14 15 >> ans - h % LÊy kÕt qu¶ tríc trõ mảng h, ta đợc lại mảng g ans= 10 11 12 >> 2*g - h % Nh©n ma trËn g với sau lấy kết trừ ma trËn h ans= 10 12 14 15 17 19 21 >> g.*h % Nhân tơng ứng phần tử mảng g với phần tư cđa m¶ng h ans= 10 12 14 16 27 30 33 36 ë vÝ dô ta đà dùng toán tử chấm_nhân ( * ), MATLAB dùng toán tử chấm_chia ( / \ ) để chia tơng ứng phần tử hai mảng nh ví dụ dới đây: >> g./h % Chia phải tơng ứng phần tử mảng g với phần tử mảng h ans= 1.0000 2.0000 3.0000 4.0000 2.5000 3.0000 3.5000 4.0000 3.0000 3.3333 3.6667 4.0000 >> h.\g % Chia trái tơng ứng phần tử mảng g với phần tử mảng h ans= 1.0000 2.0000 3.0000 4.0000 2.5000 3.0000 3.5000 4.0000 3.0000 3.3333 3.6667 4.0000 Chó ý ta chØ cã thĨ dùng phép nhân_chấm hay phép chia_chấm mảng g h mà dùng phép nhân ( * ) hay phÐp chia ( / hc \ ) phép toán yêu cầu số cột số hàng hai ma trận phải tơng thÝch vÝ dô: >> g*h ??? Error using ==> * Inner matrix dimensions must agree >> g/h Warning: Rank deficient, rank = tol = 503291e-15 ans= 0 0.8333 0 2.1667 0 3.5000 >> h/g Warning: Rank dificient, rank = tol = 1.8757e-14 ans= - 0.1250 0.1250 31 - 0.2500 - 0.3750 0 0.2500 0.3750 Phép chia ma trận đa kết mà không cần thiết phải kích cỡ nh ma trận g ma trận h Về phép toán ma trân nói đến sau +) Mảng với luỹ thừa MATLAB dùng toán tử ( ^ ) để định nghĩa luỹ thừa mảng Ví dụ ta có hai mảng g h nh trên, ta tạo mảng toán tử ( ^ ) nh sau: >> g.^2 % Các phần tử g đợc luỹ thừa vớ số mũ ans= 25 81 >> g.^-1 16 36 49 64 100 121 144 % Các phần tử g đợc luỳ thừa với số mũ -1 ans= 0.2 0.11111 >> 2.^g ans= 25 729 0.5 0.33333 0.16667 0.14286 0.1 0.090909 % Các phần tử cđa g lµ sè mị cđa 36 1000 >> g.^(h - 1) 49 1331 0.25 0.125 0.083333 16 64 1728 % Các phần tử g đợc luỹ thừa với số mũ tơng ứng phần tử h trừ ans= 81 100 121 144 Sau bảng số phép toán mảng: Các phép toán phần tử mảng Dữ liệu minh hoạ: Cộng với số đơn Nhân với số đơn Cộng mảng Nhân mảng Chia phải mảng Chia trái mảng Luỹ thừa mảng a = [a1 a2 an] , b = [b1 b2 bn] , c số vô hớng a+c = [a1 +c a2 +c an+c] a*c = [a1 *c a2 *c an*c] a+b = [ a1+b1 a2+b2 an+bn ] a.*b = [ a1*b1 a2*b2 an*bn ] a./ b = [ a1/ b1 a2/ b2 an/ bn ] a.\ b = [ a1\ b1 a2\ b2 an\ bn ] a.^c = [ a1^c a2^c an^c ] c.^a = [ c^a1 c^a2 c^an ] a.^b = [ a1^b1 a2^b2 an^bn ] 6.5 Mảng có phần tử 32 Bởi có ứng dụng chung chúng mà MATLAB cung cấp hàm để tạo mảng mà phần tử chúng Ví dụ: >> ones(3) % Tạo mảng hàng, cột với phần tư lµ ans= 1 1 1 1 >> zeros(2,5) % Tạo mảng hàng, cột với phần tử ans= 0 0 0 0 0 T¹o mảng có phần tử 1, kích cỡ mảng g đà biết >> size(g) % Hàm trả kÝch cì cđa m¶ng g ans= >> ones(size(g)) ans= 1 1 1 1 1 1 Khi gäi hµm ones(n), zeros(n) víi mét thông số n MATLAB tạo mảng vuông với sè hµng vµ sè cét lµ n Khi gäi hµm với hai thông số ones(r,c), zeos(r,c) r số hàng, c số cột 6.6 Thao tác mảng Từ mảng ma trận MATLAB, có nhiều cách để thao tác chúng MATLAB cung cấp cách tiện ích để chèn vào, lấy ra, sếp lại phần tử chúng số phần tử Ví dụ dới minh hoạ đặc điểm thao tác mảng ma trËn ë trªn: >> A = [1 A= 3; 6; 9] >> A(3,3) = % Gán phần tử hàng thứ 3, cột thứ >> A(2,6) = % Gán phần tử hàng thứ 2, cét thø b»ng A= 0 0 0 0 33 ma trận A kh«ng cã cét, kÝch cì cđa ma trËn A phải tăng lên cho phù hợp, phần tử tăng thêm đợc điền số không >> A(:,4) = A= % Gán tất phần tử thuộc cột thứ b»ng 4 0 0 ë trªn ta dïng dÊu hai chấm ( : ) để tất hµng >> A = [1 3; 6; 9]; % Gán lại giá trị ma trËn A >> B = A(3:-1:1,1:3) % T¹o ma trận B cách đảo ngợc hàng ma trËn A B= >> B = A(3:-1:1,:) % Cịng t¹o ma trận B nh % nhng ta dùng ( : ) để tất cột B= >> C = [ A B(:,[1 3])] % T¹o ma trËn C cách ghép ma trận A % cột thứ nhất, thứ ba ma trận B vào bên ph¶i ma trËn A C= 6 >> C = [1 3] C= >> B = A(C,C) % Dïng ma trËn C lµm chØ sè ®Ĩ t¹o ma trËn B Tõ ma trËn A B= >> B= A(:) % T¹o ma trËn cét B tõ ma trËn A B= >> B = B.' B= >> B = A; % ChuyÓn ma trận B thành ma trận hàng toán tử chun vÞ chÊm 34 % Lo¹i bá cét thø hai cđa ma trËn B >> B(:,2) = [] B= Khi ta g¸n cét thø hai cđa ma trận B cho ma trận rỗng ([]) bị xoá, ma trận lại rút bỏ hµng thø hai >> B = B.' B= >> B(2,:) = [] B= >> A(2,:) = B A= 7 >> B = A(:,[2 2 B= 2 4 8 % Thay hµng thø hai cđa ma trËn A b»ng ma trËn B 2]) T¹o ma trận B cách tạo bốn cột giống cột thứ hai ma trận A, số hàng giữ nguyên số hàng ma trận A >> A(2,2) = [] ??? Indexed empty matrix assignment is not allowed MATLAB không cho phép xoá phần tử ma trận mà phải xoá cột hàng >> B = A(4,:) ??? Index exeeds matrix dimension Ví dụ ma trận A bốn hàng, nên MATLAB thông báo nh >> B(1:2,:) = A ??? In an assignment A(matrix, :) = B, the number of columns in A and B must be the same MATLAB bạn gán ma trận vào ma trận khác mà kh¸c vỊ kÝch cì >> B = [1 7]; >> B(3:4,:) = A(2:3,:) B= 35 1 4 7 Nh−ng ta gán hai hàng ma trận A cho hai hµng cđa ma trËn B, ma trËn A vµ ma trËn B cã cïng sè cét Ma trận B có hàng nên thêm hàng thứ ba hàng thứ t hàng thứ hai ma trận B đợc mặc định cho thêm phần tử vào >> G(1:6) = A(:,2:3) G= Tõ phÇn tư thø nhÊt đến phần tử thứ sáu ma trận G đợc gán cột thứ hai cột thứ ba ma trận A Đôi để tiện lợi ta dùng số đơn để truy nhập đến phần tử mảng Khi số đơn đợc dùng MATLAB thứ tự phần tử mảng đợc tính phần tử cột, tính hết cột tính đến cột VÝ dô: >> D = [1 D= >> D(2) ans= >> D(5) ans= >> D(end) ans= 12 >> D(4:7) ans= 2 4; 8; 10 11 12] 10 11 12 % PhÇn tư thø hai mảng % Phần tử thứ năm mảng ( cột 2, hàng ) % Phần tử cuối mảng % Từ phần tử thứ t đến phÇn tư thø bÈy cđa ma trËn 10 Ngoài trờng hợp dùng địa dựa bảng số, dùng địa dựa mảng logic_là kết từ phép toán logic Nếu kích cỡ mảng logic cân với mảng tạo địa mảng Trong trờng hợp phần tử True (1) đợc lại phần tử False (0) bị bỏ Ví dụ: >> x = -3:3 % Tạo mảng d÷ liƯu x= -3 -2 -1 >> abs(x)>1 ans= 1 0 1 Trả mảng logic với giá trị phần tử có trị tuyệt đối lớn 36 >> y= y = x( abs(x)>1) -3 -2 Tạo mảng y cách lấy phần tử x mà có trị tuyệt đối lớn >> y = x([1 0 1]) ??? Index into matrix is negative or zero See release notes on changes to logical indices Câu lệnh bị lỗi abs(x)>1 [1 0 1] vector nh Trong trờng hợp này, [1 0 1] mảng số, mảng logic Vì MATLAB cố đánh địa phần tử có số số mảng [1 0 1] câu lệnh bị lỗi phần tử Tuy nhiên MATLAB cung cấp hàm logical để chuyển đổi tõ m¶ng sè sang m¶ng logic >> y = x(logical([1 0 1])) y= -3 -2 mảng logic làm việc với ma trận nh vector: >> B = [5 -3; -4] B= -3 -4 >> x = abs(B)>2 x= 1 0 >> y = B(x) -3 Tuy nhiên kết đợc chuyển thành vector cột không cách để định nghĩa ma trận có ba phần tử Địa mảng A( r, c ) Địa mảng mảng A, định nghĩa số vector hàng thiÕt kÕ r, chØ sè vector cña cét thiÕt kế c A( r, : ) Địa mảng mảng A, định nghĩa bằnh sè vector cđa hµng thiÕt kÕ r, vµ tÊt cột A A( : , c) Địa mảng mảng A, định nghĩa tất hàng A, số vector cột đợc thiết kế c.A( : ) Địa tất phần tử A nh vector cét, b»ng c¸ch ghÐp thø tù c¸c cét cđa vector A A( i ) Địa mảng mảng A, định nghĩa số vector đơn đợc thiết kế i, với giả sử A vector cột A( x ) Địa mảng mảng A, định nghĩa mảng logic x x phải kích cỡ với A 6.7 Tìm kiếm mảng NhiỊu chóng ta mn biÕt c¸c chØ sè hay danh sách số phần tử mảng mà thoả mÃn biểu thức quan hƯ, MATLAB ®Ĩ thùc hiƯn viƯc ®ã ta sử dụng hàm find, hàm trả danh sách số phần tử mà biểu thức quan hệ chúng đúng: >> x = -3:3 x= -3 -2 -1 >> k = find(abs(x)>1) 37 k= tìm số vị trí mà abs(x)>1 y = x(k) y= -3 -2 Tạo mảng y, dùng số mảng k Hàm find cịng cã thĨ sư dơng ma trËn: >> A = [1 3; 6; 9] A= >> [i,j] = find(A>5) i= 3 j= 3 i số hàng, j số cột; i j có mối quan hệ tơng ứng để vị trí mà biểu thức quan hệ Chú ý: MATLAB trả lại hai nhiều biến, chúng đợc đặt dấu ngoặc vuông, đợc đặt bên trái dấu Cú pháp khác với cú pháp thao tác mảng trên, mà [i,j]đợc đặt bên phải dấu bằng, xây dựng lên mảng mà j đợc kết nối vào bên phải dấu Bảng dới tóm tắt dạng lệnh phần tìm kiếm mảng: Tìm kiếm mảng i = find(x) [ r, c ] = find(x) Trả lại số mảng x nơi mà phần tử khác không Trả lại số hàng số cột mảng x nơi mà phần tử khác không 6.8 So sánh mảng Chúng ta dùng hàm isequal so sánh hai m¶ng ThÝ dơ: >> A = [1 3; A= >> B = A.*(-1).^A B= -1 -7 -5 6; 9]’ 38 -3 -9 >> C = 1:9 >> isequal(A,C) ans= >> isequal(A,B) ans= >> isequal(A,A) ans= >> isequal(C,C) ans= % Tạo mảng có giá trị với A nhng có khuôn dạng khác Hàm isequal trả lại giá trị logic (1) hai mảng có kích cỡ, phần tử giống Ngoài trả lại giá trị sai (0) Thêm vào đó, hàm ismember phần tử giống hai mảng: >> ismember(A,B) ans= 1 1 >> ismember(A,B) ans= 1 1 1 1 % Kết trả vector cột ismember trả lại giá trị cho số A mà phần tử cã ë ®èi sè thø hai Hai ®èi sè không cần có kích cỡ >> x = 0:2:20 % mảng với 11 phần tử x= 10 >> ismember(x,A) 12 14 16 18 20 39 ans= 1 1 0 mảng có kích cỡ với x, với phần tử chung >> ismember(x,A) ans= 1 1 0 0 Đây mảng có số phần tử số phần tử A, với phần tử chung Vì ismember so sánh đối số thứ với đối số thứ hai trả lại vector có số phần tử với đối số thứ Những hàm tạo khác th viện MATLAB: >> union(A,B) % Tất phần tử có hai m¶ng ans= -9 -7 -5 -3 -1 >> intersect(A,B) % Phần tử chung hai mảng ans= >> setdiff(A,B) % Các phần tử có A nh−ng kh«ng cã B ans= >> setxor(A,B) % Các phần tử không thuộc phần chung A B ans= 40 -9 -7 -5 -3 -1 Những hàm đợc tổng kết lại bảng dới đây: So sánh m¶ng isequal(A, B) ismember(A, B) intersect(A, B) setdiff(A, B) setxor(A, B) union(A, B) Đúng A B giống Đúng phần tử A phần tử B Các phần tử chung A B Các phần tử có A mà B Các phần tử không thuộc phần chung A B Tất phần tử có A B 6.9 Kích cỡ mảng phần trớc đà biết lệnh who cung cấp tên biến ngời dùng định nghĩa Trong trờng hợp mảng, nã cßn rÊt quan träng biÕt kÝch cì cđa mảng Trong MATLAB, lệnh whos cung cấp thông tin nµy: >> whos Name size Bytes Class A 3x3 72 double array B 1x3 24 double array ans 1x4 32 double array Grand total is 16 elements using 128 bytes (logical) Thêm vào để đánh số kích cỡ biến, whos hiển thị tổng số bytes đà chiếm, class biến Ví dụ, thông tin đề cập trên, ans mảng logic Trong trờng hợp mà kích cỡ ma trận vector không đợc biết nhng cần thiết cho số thao tác, MATLAB cung cấp hai hàm ứng dụng lµ size vµ length : >> A = [1 >> s = size(A) s= 4; 8]; Với thông số ra, hàm size trả lại vector hàng có hai phần tử, phần tử thứ số hàng, phÇn tư thø hai chØ sè cét >> [r,c] = size(A) r= c= Với hai thông số đa ra, hàm size trả lại số hàng biến thø nhÊt, vµ sè cét ë biÕn thø hai 41 >> r = size(A,1) r= >> c = size(A,2) Gọi hai thông số, hàm size trả số cột số hàng >> length(A) ans= Trả giá trị số hàng số cột, giá trị lớn đợc trả >> B = pi:0.01:2*pi; >> size(B) ans= 315 Cho biÕt r»ng B lµ vector hàng, >> length(B) ans= 315 trả lại độ dµi cđa vector >> size([ ]) chØ r»ng ma trận rỗng kích cỡ Những khái niệm đợc tổng kết bảng dới đây: Kích cỡ m¶ng whos s = size(A) [ r, c ] = size(A) r = size(A, 1) c = size(A, 2) n = length(A) Hiển thị biến, mà tồn không gian làm việc kích cỡ chúng Trả lại vector hàng s, mà phần tử thứ số hàng A, phần tử thứ hai số cột A Trả lại hai số vô hớng r, c chứa số hàng số cột A Trả lại số hàng A biến r Trả lại số cột A biến c Trả lại max(size(A)) biến n A không rỗng 6.10 Mảng nhiều chiều Đối với MATLAB versions trớc 5.0, mảng cã thĨ cã mét hc hai chiỊu Tõ MATLAB 5.0 trở lên số chiều mảng đà tăng lên VÝ dô: >> a = [1 0; 1] a= 0 >> b = [2 2; 2] b= 2 2 >> c = [0 3; 0] 42 c= 3 >> d = cat(3,a,b,c) d(:,:,1)= 0 d(:,:,2)= 2 2 d(:,:,3)= 3 >> size(d) ans= 2 Tạo mảng hai chiều a, b, c, sau ghép chúng lai với thành mảng ba chiều cách sử dụng hàm cat Nh mảng d mảng có hai hàng, hai cột, ba trang Mảng a tạo trang thứ nhất, b lµ trang thø hai, vµ c lµ trang thø ba Thông số trang diễn tả chiều thứ ba mảng, cung cấp cách hình dung mảng ba chiều nh mảng hai chiều, trang xếp thứ tự từ cuối nh sách Đối với mảng có số chiều cao hơn, tên chung, khó tởng tợng! Thao tác với mảng nhiều chiều giống nh thủ tục đa mảng chiều hai chiều Ngoài MATLAB cung cấp số hàm thao tác trực tiếp mảng nhiều chiều: Các hàm với mảng nhiều chiều s = size(A) Cho n_số chiều A, trả vector hàng s với n phần tử, phần tử thứ i kích cì chiỊu thø i cđa m¶ng A ndims(A) Sè chiỊu A, tơng tự nh hàm length(size(A)) permute(A, order) n_số chiều, tơng đơng với toán tử chuyển vị chấm ipermute(A, order) Ngợc với hàm permute(A, order) shiftdim(A, n) Thay đổi số chiều mảng A số nguyên n squeeze(A) Trả lại số chiều mảng, tơng đơng với trả lại số chiều lớn ba Ví dụ: Sự suy giảm phân rà dùng mảng Vấn đề: Phân tử polonium có chu kỳ phân rà 140 ngày, có nghĩa phân rà mà khối lợng poloniun lại 1/ so với khôi lợng ban đầu sau 140 ngày Giả sử ban đầu ta có 10 grams polonium, lại sau tuần vòng mời tuần? Giải pháp: Ta sử dụng phơng pháp giải chơng 2, khối lợng lại sau sau khoảng thời gian là: khối lợng lại = khối lợng ban đầu (0.5)thời gian/ chu kỳ Để giải toán này, gải pháp MATLAB là: >> initial_amount = 10; % Khối lợng chất polonium ban đầu >> half_life = 140; % Chu kú ph©n r· >> time = 7:7:70 % Kết thúc tuần time= 14 21 28 35 42 49 56 63 70 >> amount_left = initial_amount*0.5.^(time/ half_life) 43 amount_left= Columns through 9.6594 9.3303 9.0125 Columns through 10 7.5786 7.3204 7.0711 8.7055 8.4090 8.1225 7.8458 Dùng toán tử mảng làm cho tính giá trị cách đơn giản nhân nhiều giá trị biến Chú ý nhân chấm (.^) đợc sử dụng muốn luỹ thừa 0.5 lên phần tử mảng Những liệu dễ dàng vẽ chúng MATLAB nh− h×nh d−íi: >> plot(time/7,amount_left) >> xlabel(‘Week number’), ylabel(‘Amount of Polonium left) Hình 6.1 Ví dụ: Tìm kiếm giải pháp sử dụng vectors Vấn đề: Vấn đề tuần trờng cấp hai tìm số nhỏ 100 mà chia hết cho 7, nhng d lại chia cho 2, 3, 4, 5, vµ Giải pháp: Không có giải pháp phân tích cho vấn đề cả, phải giải phơng pháp tìm kiếm Nếu bạn bắt đầu với tất số bội số nhỏ 1000, số khác không xét đến, bạn xây dựng đợc giải pháp Trong MATLAB giải pháp đợc đa script file lµ: function pow % pow.m script file to solve problem of the week n=7:7:1000 % all multiples of less than 1000 number=length(n) % number of potential solutions n(rem(n,2)~=1)=[]; % throw out non solutions by number=length(n) 44 n(rem(n,3)~=1)=[]; number=length(n) n(rem(n,4)~=1)=[]; number=length(n) n(rem(n,5)~=1)=[]; number=length(n) n(rem(n,6)~=1)=[]; %setting them equal to an empty array, % the function rem computes remainders Ch¹y script file ta đợc giải pháp nh dới đây: >> pow number = 142 number = 71 number = 24 number = 12 number = n= 301 721 VÝ dụ: Tính toán nồng độ acid dùng phép toán với mảng Vấn đề: Nh phần trình sản xuất phận vật đúc nhà máy tự động, phận đợc nhúng nớc ®Ĩ lµm ngi, sau ®ã nhóng bån ®ùng dung dịch acid để làm Trong toàn trình nồng độ acid giảm phận đợc lấy khổi bồn acid nhúng phận vật đúc vào bồn lợng nớc bám vật đúc nhúng bể trớc cịng vµo theo vµ nhÊc khái bån mét lợng acid bám theo vật Để đảm bảo chất lợng nồng độ acid phải không đợc nhỏ lợng tối thiểu Bạn hÃy bắt đầu với nồng độ dung dịch 90% nồng độ tối thiêu phải 50% Lợng chất lỏng thêm vào lấy sau lần nhúng dao động khoảng từ 1% ®Õn 10% Hái bao nhiªu bé phËn cã thĨ nhóng vào bể nớc acid trớc nồng độ giảm xuống dới múc cho phép? Giải pháp: Ta sử dụng phơng pháp giải đa chơng 2: n= Trong MATLAB, giải pháp viết script M_file là: function example6_2 % script M_file example6_2 initial_con=90; min_con=50; lost=1:10 % consider 1% to 10% in increments of 1% n=floor(log(initial_con/min_con)./log(1+lost/100)) stem(lost,n) xlabel('Percent Lost with Each Dip') ylabel('Number of Dips') 45 title('Acid-Water Bath Dipping Example') Chạy chơng trình ta đợc kết nh− sau: lost = n = 59 10 29 19 14 12 10 6 H×nh 6.2 Chó ý yêu cầu phơng pháp chia chấm log(1 + lost/ 100) lµ mét vector oOo chơng phép tÝnh víi m¶ng ... 81 >> g. ^-1 16 36 49 64 100 121 144 % Các phần tử g đợc l thõa víi sè mị lµ -1 ans= 0.2 0.11111 >> 2.^g ans= 25 729 0.5 0.33333 0. 166 67 0.142 86 0.1 0.090909 % Các phần tử g sè mị cđa 36 1000 >>... -9 -7 -5 -3 -1 >> intersect(A,B) % PhÇn tư chung cđa hai m¶ng ans= >> setdiff(A,B) % Các phần tử có A nhng B ans= >> setxor(A,B) % Các phần tử không thuộc phần chung A vµ B ans= 40 -9 -7 -5 -3 ... mảng x nơi mà phần tử khác không 6. 8 So sánh mảng Chúng ta dùng hàm isequal so sánh hai mảng Thí dụ: >> A = [1 3; A= >> B = A.* (-1 ).^A B= -1 -7 -5 6; 9]’ 38 -3 -9 >> C = 1:9 >> isequal(A,C) ans=