Máng tế bảo được xem như một mảng của các số nhị phân hoặc là như bộ chứa có thể lưu giữ nhiều kiểu dữ liệu khác nhau.. Cấu trúc là những mảng dữ liệu hướng đối tượng xây dựng cùng với t
Trang 1CHUONG 19
MATLAB 5.0 giới thiệu 2 loại dữ liệu mới có tên gọi là mảng tế bào và cấu trúc Máng tế bảo được xem như một mảng của các số nhị phân hoặc là như bộ chứa có thể lưu giữ nhiều kiểu dữ liệu khác nhau Cấu trúc là những mảng dữ liệu hướng đối tượng xây dựng cùng với tên các trường có thể chứa nhiều kiểu dữ liệu khác nhau, bao gồm mảng tế bào và các cấu trúc
khác Cấu trúc cúng cấp cho ta phương tiện thuận lợi để nhóm các kiểu dữ liệu khác nhau
Những kiểu dữ liệu mới này, máng tế bào và cấu trúc tạo cho bạn khả năng tổ chức dữ liệu thành các gói rất thuận tiện
19.1 Mang té bao
Máng tế bào là những mảng MATLAB mà các phân tử của nó là các tế bào Mỗi tế bảo
trong mảng tế bào chứa các kiểu dữ liệu của MATLAB bao gồm mảng số, văn bản, đối tượng đặc trưng, các máng lế bào và cấu trúc Vi dụ một tế bào của máng tế bào có thể là mang sé, loại khác là kiểu chuỗi văn bản, loại khác là vector các giá trị số phức Các mảng tế bào có thể được :‹ây dựng với số chiêu lớn hơn 2, tuy nhiên để cho thuận tiện khi xét người ta lấy số chiều
là 2
18.2 Xây dựng và hiển thị mảng tế bào
Mảng tế bảo có thể được xây dựng bằng cách dùng câu lệnh gán, hoặc chỉ định mảng trước bằng cách sử dụng hàm tế bào sau đó gán dữ liệu cho mảng
Như mọi loại mảng khác, mảng té bao cé thé tao ra bằng cách gán dữ liệu cho từng tế bảo độc lập ở cùng một thời điểm Có hai cách khác nhau thâm nhập vào mảng tế bào Nếu bạn sử
dụng cú pháp mảng tiêu chuẩn, bạn phải để các tế bào trong dấu ngoặc "{ }" Ví dụ:
>>A(1,1)={1 2 3: 456 789},
>>A(1,2)={2+ 3Ÿ,
>> A(2, 1) ={ A text string 7:
216
Trang 2>> A(2, 2) = (12: -2:0};
Dấu ngoặc nhọn bên phía phải của dấu bằng chỉ ra rằng biểu thức là một tế bào, hay còn gọi là chỉ số tế bào Cách viết sau tương đương với cách viết trên:
>> AUI,1) = [1 23:45 6: 7 8 9];
>> AML, 2} = 243):
>> A{2,1}=‘Atext string’:
>> A(2, 2} = 12: -2: 0:
Dấu ngoặc nhọn bên trai chi ra rang A la mOt mang té bao va biéu thie dat bén trong [a
khai báo tế bào
MATLAB hién thi mang A nhu sau:
>> A
A=
[3X3 double] 2.0000+ 3.0000 i
"A text string [1x7 double |
Để hiển thị nội dụng của mỗi tế bao trong mang tế bào ta dùng hàm ce/a”sø, hiển thị nội
dung của riêng một tế bào, truy nhập vào tế bào có sử dụng dấu ngoặc nhọn Ví dụ:
>> A22)
MATLAB hién thi so đô cấu trúc đồ hoa máng tế bào trong một cửa số bằng việc gọi hàm
celipiot
Ham ce/ làm việc với mảng tế bảo bằng việc tạo ra các máng trống theo kích cỡ của mang Vi du:
>> C= cell (2, 3)
19.3 Tổ hợp và khôi phục mắng tế bào
Nếu bạn gán dữ liệu cho tế bào ngoài số-chiều hiện có của mảng MATLAB sẽ tự động mở rộng mảng và điền vào giữa ma trận số rỗng Chú ý khái niệm "{]" thay cho ma trận tế bào rỗng va “[ ]’ thay cho mang sé ma tran rong
Trang 3Sử dụng dẫu móc vuông để kết nối mảng tế bao:
>> C=|A BỊ
C=
[3x3 double] 2.0000+ 3.0000) [1x2 double] ' John Smith’
‘A text string [1x7 double] [200001300001] [ 5 |
>> C=lA‘B]
C=
[3x3 double | 2.0000 + 3.0000:
‘A text string’ [1x7 double |
[1x2 double] =‘ John Smith’
¡2.0000+ 3.0000] [ 5]
Một tập con các tế bào có thể được tách ra tạo thành một màng tế bào mới Nếu D là một
mảng tế bào 3x3, người ta có thể tách ra để tạo thành một mảng tế bào mới 2x2 như sau:
>>Ƒ = D(2:2,2:3);
Hàm zes/ape có thể được sử dụng để thay đổi cấu hình của một mảng tế bào nhưng
không thể dùng để thêm vào hoặc bớt đi tế bào,
>> X= cells(3,4);
-_ >> size(X)
ans =
3 4
>> X= reshape(X.6,2);
>> size(Y)
ans =
6 2
18.4 Truy nhập vào trong máng tế bào
Để truy nhập dữ liệu chứa trong các phần tử của mảng tế bảo, sử dụng dấu ngoặc nhọn
Dùng dấu ngoặc đơn thâm nhập mội phần tử như là một lế bào Để truy nhập nội dung của
phan tir trong mang té bao, kết nối các biểu thức như sau:
>>x= B22) % truy nhập nội dung của tế bào
Trang 4>> class(x)
ans=
double
>> y = B[2,2] % truy nhap vao ban than té bao
y=
[5]
>> class(y)
ans=
cell
>> B{1,1}(1,2) % truy nhập vào phần tử thứ hai của
% vectortrong tế bào
ans=
2
Để truy nhập dải các phần tử trong mảng tế bào, sử dụng hàm dea/
>> [a,b] = deal(B{2,:1})
a=
2.0000+ 3.0000
5
Ham dea/can mot danh sach cac bién phan biét nhau bởi dấu phảy Biểu thức B{2,:} có thé str dung 6 moi noi va dau phay ding dé phan tach danh sach cac bién Do do, B{2,:} tuong duong vdi B(2,1) va B(2,2)
19.5 Mang tế bào của chuỗi kí tự
Một trong những ứng dụng phổ biến của mảng tế bào là xây dựng một mảng văn bản Mảng chuỗi kí tự tiêu chuẩn đỏi hỏi tất cả các chuỗi đều có chung độ dài Bởi vì mảng tế bào có
thể chứa nhiều kiểu dữ liệu khác nhau trong mỗi phần tử, chuỗi kí tự trong mảng tế bào không
có giới hạn này Ví dụ:
Trang 5>> T = {' Tom’; Disk}
T=
‘Tom’
‘Disk’
19.6 Cau tric
Cấu trúc là những đối tượng MATLAB có tên “bộ chứa dữ liệu” còn gọi là Ze/đs, Như mọi phần tử của mảng tế bảo, trường cấu trúc có thể có bất cứ mội kiểu dữ liệu nào, Chúng khác ở
chỗ cấu trúc trưởng được truy nhập bằng tên phổ biến hơn là chỉ số, và không có sự hạn chế
nào về chỉ số cũng như cấu hình của các trường cấu trúc Cũng giống như mảng tế bao, cấu trúc có thể được nhóm lại với nhau tạo thành máng và mảng tế bào Một cấu trúc đơn là một
mảng cấu trúc 1x1
19.7 Xay dung mang cấu trúc
Cấu trúc sử dụng dấu “ “ để truy nhập vào trường Xây dựng một cấu trúc đơn giản như
gan dữ liệu vào các trường độc lập Ví dụ sau tạo một bản ghi client cho thư viện kiểm tra,
>> client.name = ` John Doe;
>> client.cost = 86.50;
>> clientes AIC = [6.3 6.8 7.1 7.0 6.7 6.5 63 6.4]
>> client.test CHC = [2.8 3.4 3.6 4.1 3.5]
>> client
client =
name L' John Doe ' cost:86.50
test: [1x1 struct]
>> Client test
ans=
AIC:6.3000 6.8000 7.1000 7.0000 6.7000 6.2000 6.3000 6.4000
CHC:2.8000 3.4000 3.6000 4.1000 3.5000
Bây giờ tạo bản ghi client thir hai:
Trang 6>> client(2}.name = ' Alice Smith‘:
).cost = 112.35;
>> client(2).tesL AIC = (5.3 5.8 7.0 6567 5.5 6.0 5.9]
>> client(2) test CHC =[3.8 6.3 3.2 3.1 25],
>> client
(
>> client(2
( (
client =
1x2 struct array with field
name
cost
test
Cấu trúc cũng có thể được xây dựng bằng cách dùng hàm struct để tạo trước mội mảng cấu trúc Cú pháp là: ( field’ V1, ‘ fleld2’, V2, ) trong dé field1, field2, v.v la cac trường, và các mảng V1, V2, v.v phải là các mảng tế bảo có cùng kích thước., cùng số tế bảo, hoặc giá
trị Ví dụ, một mảng cấu trúc có thể được tạo ra như sau:
>> N ={' John Doe `, ' Alice Smith}:
>>C= 6.50, 112.35};
>> P = {[10.00 20.00 45.00);
>> bills = struct(‘name’N,‘cost’,C,’payment’,P}
bils=
1x2 struct array with fields
name cost
payment
19.8 Truy nhập vào các trường cấu trúc
Bởi vi nội dung cấu trúc là tên nhiều hơn là chỉ số, như trong trường hợp máng tế bào, lên của các trường trong cấu trúc phải được biết đến để truy nhập dữ liệu chứa trong chúng Tên
của các trường có thể được tìm thấy ở trong ở trong cửa số lệnh, đơn giản là chỉ việc nhập vào
lên của cấu trúc Tuy nhiên ở trong M-fie, một hàm cần thiết được tạo ra để cập nhật các tên trường đó Hàm Aefdname tra lai mot mang té bào có chứa tên của các trường trong mội cấu trúc
Trang 7>> T = fieldnammes(bills)
T=
‘name ' cost |
‘payment’
Có hai phương pháp để truy nhập vào trường cấu trúc, Chỉ số trực tiếp sử dụng kĩ thuật chi
mục thích hợp, như phương pháp truy nhập trường cấu trúc, và chỉ số mảng thích hợp để truy nhập vào một số hoặc mộ mảng tế bào Sau đây là một ví dụ dựa trên cấu trúc bills va client
đã xét ở trên:
>> bills name
ans =
John Doe
ans=
Alice Smith
>> bills(2).cost
ans=
112.3500
>> bills(4)
ans=
name: ' John Doe‘
cost: ' 86.5000 '
payment: 10.000 20.0000 45.0000
>> baldue = bills(1).cost - sum(Bils(1).paymen)
baldue=
6.5000
>> bills(2).payment(2)
ans =
12.3500
>> client(2).test AIC(3)
Trang 8ans=
7000
Phương pháp chỉ mục trực tiếp thường được sử dụng để truy nhập giá trị trưởng Tuy nhiên, ở các M-file nếu tên các trường được gọi ra từ hàm /#eldnames, thì hàm geffield và
sefffeld có thể được sử dụng để truy nhập dữ liệu trong cấu trúc Ví dụ:
>> getfield(biils,{1},name) — % tương tự như bils(1).name
ans=
John Doe
>> T = fieldnames(bills):
>> getfriend(bills {2}, 13} {2 tương tự như s(2),paymenl(2)
ans=
12.3500
Ví dụ sau trả lại cấu trúc có chứa cùng kiểu dữ liệu như cấu trúc nguyên thuỷ với một giá trị
bị thay đổi Dòng lệnh tương đương của client(2).tesLAIC(3) = 7.1 là:
>> client = setfield(cient{2 },test, "AIC '{3},7.1}
client=
‘x2 struct array with fields
name cost
test
>> client(2).tesLAIC(3)
ans=
7.1000
Một trường có thể được thêm vào trong một máng cấu trúc chỉ đơn giản bang cách gan gia
trị cho trường cấu trúc mới
>> client(1).addr = { MyStreet MyCity )
client =
1x2 struct array with fields
name
Trang 9cost test addr
Một trường có thể được bỏ đi khỏi cấu trúc (hoặc một mảng cấu trúc) bằng lệnh zmfe/d
$= mrnfield (S, ' field’) s& bỏ đi trường field từ cấu trúc S $= rmnfield (S, F) trong dé F la mat
mắng tế bào của tên các trưởng, bỏ đi nhiều hơn một trường từ cấu trúc S tại một thời điểm
>> client = rmfield(chent,’ addr‘)
client =
1x2 struct array with fields
name
cost fest
19.9 Sunghich dao va ham kiém tra
Sự nghịch đảo giữa các máng tế bào và các cấu trúc bằng cách dùng hàm struct2celfva cell2strucf Tên trường phải được cùng cấp đây đủ cho cefl2sfucf và bị mất đi khi chuyển
thành mội máng tế bào từ một cấu trúc Sự chuyển đối từ mảng số và mảng xâu kí tự thành
mảng tế bào bằng cách sử dụng hàm zm2ceflvà ceffsứ: Ngược lại chuyển đổi từ một màng tế
bào thành mang ki tu bang ham char
Mặc dù hàm c/ass trả về kiểu kiểu dữ liệu của đối tượng, e/ass vẫn không thuận tiện sử
dụng để kiểm tra kiểu dữ liệu Hàm ésa(x, ‘ class ‘) tra lai frue néu x là một đối tượng kiểu
‘class’ Ví dụ, /sa(client, ' struct ) sẽ trả lại true Để thuận tiện, một số hàm kiểm tra số khác có
sẵn trong thư viện chương trình như: “sữuct, iscell, ischar, isnumeric, va islogical