Dữ liệu số

Một phần của tài liệu Tài liệu ứng dụng máy tính trong thiết kế ô tô (Trang 43 - 61)

Chương 3 Các công cụ tốn học thơng thường của Matlab

4.1.1.Dữ liệu số

4.1. Các loại dữ liệu dùng trong Matlab

4.1.1.Dữ liệu số

MATLAB sử dụng chế độ ghi số thập phân thông thường với tuỳ chọn về chế độ ghi số chữ số sau dấu phảy và dấu +, - trước giá trị số (xem lệnh format). Bên cạnh chế độ ghi số thập phân thơng thường, ta có thể dùng kiểu ghi sử dụng chữ cái e để xác định số mũ cơ số 10. Phần ảo của số phức được thêm phần hậu tố là chữ cái i hoặc j. Dưới đây là một vài thí dụ về dữ liệu số hợp lệ có thể dùng trong Matlab:

3 -99 0.0001 9.6397238 1.60210e-20 6.02252e23 1i -3.14159j 3e5i

Tất cả các số được lưu trữ ở bộ nhớ trong và sử dụng định dạng dài (có 16 chữ số sau dấu phảy) và giá trị giới hạn nằm trong khoảng từ 10-308 to 10+308.

Các hằng số thường được sử dụng trong Matlab.

Bảng 4.1. Các hằng số thường sử dụng trong Matlab

4.1.2. Các phép tính trên số phức

4.1.2.1 Nhập dữ liệu

Số phức được nhập ở dạng Phần thực + phần ảo i Ví dụ: x= 2+3i

4.1.2.2 các phép tính thực hiện trên số ảo

- Phép cộng: Sử dụng toán tử +,

pi 3.14159265

i Đơn vị ảo, -1

j Đơn vị ảo (tương tự i)

eps Độ chính xác tương đối của số thực, 2-52

realmin

Giá trị nhỏ nhất của số thực, 2-1022

realmax Giá trị lớn nhất của số thực, (2-)21023

Inf Vô cùng lớn

- Phép trừ: Sử dụng toán tử -,

- Phép nhân: Sử dụng toán tử *,

- Phép chia: Sử dụng tốn tử / Ví dụ:

Nếu X= 3 +4i, Y=5+6i, ta sẽ có: X+Y ans = 8.0000 +10.0000i X*Y ans = -9.0000 +38.0000i X-Y ans = -2.0000 - 2.0000i X/Y ans = 0.6393 + 0.0328i 4.1.2.3 Các hàm xử lý số phức a. Hàm real

Lấy ra giá trị phần thực của số phức

Ví dụ: Nếu ta có X=3 +4i, real(X) sẽ cho giá trị 3

b. hàm imag

Lấy ra phần ảo của số phức

Ví dụ: với X lấy giá trị như trên, imag(X) sẽ cho giá trị 4

c. Hàm conj

Tìm số phức liên hợp của số phức đã cho

Ví dụ: với X lấy giá trị như trên, conj(X) sẽ cho giá trị 3-4i

4.1.3. Dữ liệu dạng chuỗi (adsbygoogle = window.adsbygoogle || []).push({});

4.1.3.1. phép gán và tham chiếu đến dữ liệu dạng chuỗi Phép gán: <tên biến>='chuỗi'

Tham chiếu đến dữ liệu

Chuỗi là một véc tơ hàng có số phần tử bằng số chữ cái trong chuỗi để tham chiếu đến từng chữ cái ta chỉ cần gọi phần tử tương ứng của chuỗi

x =

String Mat

Khi gọi x(1), ta nhận được ans = S

nếu gọi x(1:6), ta sẽ nhận được ans = String

4.1.3.2. Tạo các mảng với phần tử là chuỗi

a, Tạo véc tơ cột các chuỗi:

Nhập trực tiếp : nhập theo nguyên tắc giống mảng với các phần tử là số, tuy nhiên

yêu cầu các chuỗi có chiều dài như nhau, trong trường hợp các chuỗi có chiều dài khác nhau, ta phải thêm bước trống vào cuối chuỗi.

Ví dụ: x=['first ' 'second' 'third '] x = first second third

Dùng các hàm : char, str2mat, strvcat Cú pháp: char('chuỗi 1', 'chuỗi 2', ....)

str2mat('chuỗi 1', 'chuỗi 2', ....) strvcat('chuỗi 1', 'chuỗi 2', ....)

Chú ý : hai hàm char và str2mat có cùng cú pháp, sẽ chèn cả các chuỗi rỗng vào

mảng, còn strvcat sẽ bỏ qua chuỗi rỗng Ví dụ: x=char('first','second', '', 'third') và

x=str2mat('first','second', '', 'third') sẽ cho cùng kết quả là véc tơ cột có 4 phần tử

x = first second third

Tuy nhiên hàm: x= strvcat ('first','second', '', 'third'), sẽ cho kết quả là véc tơ cột có 3 phần tử:

x = first second third

b, Tạo mảng hoặc véc tơ hàng các chuỗi

Dùng mảng khối:

Mảng khối được nhập như mảng thông thường, chỉ khác là mảng được bao bằng dấu {}

Các phần tử của mảng khối sẽ là các chuỗi

ví dụ:

x={'first' 'second' 'third'} x =

'first' 'second' 'third' Nếu gọi : x(1), ta nhận được ans =

'first'

4.1.3.3. Các hàm dùng trên chuỗi

a, Hàm chuyển đổi từ ký tự sang mã ascci và ngược lại (adsbygoogle = window.adsbygoogle || []).push({});

* Hàm double

Cú pháp: double(t), t là chuỗi sẽ trả một véc tơ hàng với các phần tử là mã ascci của

các ký tự tương ứng trong chuỗi

Chú ý : hàm này có thể dùng trên véc tơ Ví dụ: a='abc' a = abc double(a) ans = 97 98 99

* Hàm char: chuyển từ mã ascci sang ký tự Ví dụ: char(65) sẽ cho ta A

Nếu đối số là mảng các số nguyên, ta nhận được chuỗi ký tự.

Ví dụ : char([65 66])=AB

Chú ý: hàm char ngoài chức năng chuyển từ mã ascci sang ký tự cịn có chức năng tạo mảng các phần tử là chuỗi và biến đổi các mảng khối về mảng thơng thường

Ví dụ:

S = char(C) với c là mảng khối các chuỗi sẽ đặt mỗi một phần tử của c thành các

hàng của mảng ký tự s (hàm ngược của nó là cellstr). xét mảng khối x={'3.123' '4.578'}

3.123 4.587

b, Hàm chuyển đổi từ dữ liệu số sang chuỗi và ngược lại

* chuyển từ số sang chuỗi: int2str, num2str, mat2str Hàm int2str: chuyển số nguyên sang chuỗi.

Cú pháp : str = int2str(N) Mô tả:

str = int2str(N) Chuyển số nguyên sang chuỗi với định dạng của số nguyên.

N có thể là một số nguyên riêng lẻ hoặc mảng các số nguyên. Các giá trị thực sẽ được làm tròn trước khi chuyển đổi.

Chuyển cỏc ký tự trong một chuỗi sang số thứ tự tương ứng trong bảng mó ASCII

Ví dụ:

int2str(2+3) là chuỗi '5'.

int2str(3.5) =4

Hàm num2str

Chuyển đổi từ số thực sang chuỗi

Cú pháp

str = num2str(A)

str = num2str(A,precision) str = num2str(A,format)

Mô tả

Hàm num2str chuyển đổi các số thực sang chuỗi. Hàm này được dùng nhiều khi cần đưa vào đồ thị các nhãn hoặc tiêu đề bằng các giá trị số thực.

str = num2str(a) chuyển đổi mảng A thành chuỗi str với 4 chữ số sau dấu phảy và số mũ nếu cần thiết.

str = num2str(a,precision) chuyển đổi mảng A thành chuỗi str với độ chính xác được quy định bằng 'precision'. đối số precision quy định số chữ số sau dấu phảy, mặc định là 4. (adsbygoogle = window.adsbygoogle || []).push({});

str = num2str(A,format) chuyển đổi mảng A sử dụng định dạng quy định bằng 'format'. (xem lệnh fprint).

num2str(pi) là 3.142.

num2str([1/3 3/6]) là 0.33333 0.5 num2str(3/7,5) cho kết quả là: 0.42857

Hàm mat2str Cú pháp:

str = mat2str(A) str = mat2str(A,n)

Mô tả

str = mat2str(A) Chuyển ma trận A thành chuỗi, phù hợp với dữ liệu đầu vào của hàm eval, sử dụng độ chính xác cao nhất.

str = mat2str(A,n) Chuyển đổi ma trận A thành chuỗi với n chữ số sau dấu phảy.

Chú ý: Hàm mat2str chỉ được thực hiện trên các giá trị số, véc tơ hoặc mảng chữ

nhật. Ví dụ: Xét ma trận: A = 1 2 3 4 Câu lệnh b = mat2str(A) cho kết quả: b = [1 2 ;3 4 ]

* chuyển từ chuỗi sang số, thực hiện các phép tính: hàm eval Cú pháp

eval(expression)

[a1,a2,a3,...] = eval(expression) eval(expression,catch_expr) Công dụng: Chuyển đổi chuỗi ký tự thành biểu thức Mô tả

eval(expression) thực hiện biểu thức được mô tả trong chuỗi 'expression'.

Bạn có thể tạo ra 'expression' bằng cách nối kết các chuỗi con và các biến trong ngoặc vuông ở dạng dưới đây

expression = [string1,int2str(var),string2,...]

[a1,a2,a3,...] = eval(expression) thực thi biểu thức expression

và đưa ra các kết quả trong các biến đầu ra chỉ định. biểu thức phải đưa ra ở dạng sau:

eval('[a1,a2,a3,...] = function(var)')

eval(expression,catch_expr) thực thi biểu thức expression và nếu

biểu thức bị lỗi nó sẽ thực thi biểu thức catch_expr . Nếu expression có lỗi, ta có thể lấy ra chuỗi báo lỗi bằng hàm lasterr.

Ví dụ:

- y=eval('5+6-7'), cho kết quả y =4

- Nếu ta có x='5+6-sin(pi)', hàm y=eval(x) sẽ cho kết quả: y =11 - eval(['sin(pi/2)' '+' 'cos(pi)']), cho kết quả là 0

* Lệnh STR2NUM

- Cụng dụng:

Chuyển chuỗi (dạng số) sang số thực. - Cú pháp: n = str2num(s) - Giải thích: s: chuỗi dạng số. n: số thực. - Ví dụ: n = str2num(‘456456’) n = 456456 * hàm sprintf Cú pháp: s = sprintf(format,A,...) [s,errrmsg] = sprintf(format,A,...) Mô tả:

s = sprintf(format,A,...) Định dạng các dữ liệu trong ma trận A, trên cơ

sở của chuỗi quy định mẫu định dạng 'format' và trả kết quả cho biến dạng chuỗi s. Câu lệnh sprintf cũng có ý nghĩa tương tự như fprint, điểm khác chỉ ở chỗ câu lệnh fprint thường dùng để xuất dữ liệu ra tệp.

Chuỗi format quy định các ghi chú, căn chỉnh, số chữ số, bề rộng của trường. Nó có thể chứa các dữ liệu số, chữ và các ký tự điều khiển theo cấu trúc sau: (adsbygoogle = window.adsbygoogle || []).push({});

[s,errrmsg] = sprintf(format,A,...) sẽ trả các dòng báo lỗi vào chuỗi

errrmsg.

Bảng dưới đây sẽ mơ tả các ký tự khơng nhìn thấy được sử dụng trong định dạng của lệnh sprintf.

ký tự Mơ tả

\b Xố lùi

\f Kéo giấy

\n Xuống dòng

\t lùi vào một bước tab

\\ Backslash

\'' dấu "

%% dấu %

Bảng 4.3. Các quy định chuyển đổi

ký tự điều khiển Mô tả

%c Ký tự riêng lẻ

%d chế độ ghi số thập phân dùng dấu chấm động

%e ghi bằng số e (sử dụng e)

%E ghi bằng số e (sử dụng E)

%f Cho phép quy định số chữ số xuất ra

%g Chế độ ghi ngắn gọn %e, %f, Các chữ số 0 phía sau khơng

được in ra

%G Giống %g, nhưng sử dụng E thay cho e

%s Ghi chuỗi ký tự

Bảng 4.4. Các ký tự khác

Ký tự Mơ tả Ví dụ

Dấu (-) Left-justifies the converted argument in its field. %-5.2d

Dấu (+) Luôn in dấu (+ hoặc -) trước số xuất ra. %+5.2d

Số (0) Đưa vào các số 0 thay cho các khoảng trống. %05.2d

Số nguyên Quy định số lượng chữ số ít nhất được in ra. %6f

Số với dấu chấm động)

Số với dấu . xác định số lượng chữ số được in sang phải dấu chấm phân cách. (adsbygoogle = window.adsbygoogle || []).push({});

%6.2f

Ví dụ

Lệnh Kết quả sprintf('%0.5g',(1+sqrt(5))/2) 1.618 sprintf('%0.5g',1/eps) 4.5036e+15 sprintf('%15.5f',1/eps) 4503599627370496 sprintf('%d',round(pi)) 3 sprintf('%s','hello') hello

sprintf('The array is %dx%d.',2,3) The array is 2x3

sprintf('\n') Xuống dòng

* hàm sscanf

Đọc chuỗi theo định dạng quy định, hàm có ý nghĩa như là hàm ngược của sprintf.

Cú pháp

A = sscanf(s,format)

A = sscanf(s,format,size)

[A,count,errmsg,nextindex] = sscanf(...)

Mô tả

A = sscanf(s,format) Đọc dữ liệu từ chuỗi s, chuyển đổi nó phù hợp với định

dạng được quy định trong format và trả ra kết quả cho ma trận a. sscanf có ý nghĩa tương tự như fscanf, ngoại trừ fscanf thường dùng để đọc dữ liệu từ tệp hơn.

A = sscanf(s,format,size) Đọc số phần tử quy định trong size và chuyển

đổi nó phù hợp với định dạng quy định trong format. size có thể lấy các giá trị sau:

Bảng 4.6. Một số giá trị size trong hàm sscanf

n Đọc n phần tử và trả véc tơ cột

inf Đọc đến cuối tệp và trả kết quả ra véc tơ cột.

[m,n] Đọc đủ số phần tử để điền vào ma trận m x n phần tử.

Nếu ma trận A là kết quả chỉ của việc sử dụng các ma trận chuyển đổi, và size không ở dạng [M,N], véc tơ hàng sẽ được trả.

[A,count,errmsg,nextindex] = sscanf(...) Đọc dữ liệu từ chuỗi s, chuyển đổi nó phù hợp với quy định trong format và trả nó cho ma trận A, count là biến xuất ra tuỳ chọn, cho biết số phần tử được đọc thành công. errmsg là biến xuất ra tuỳ chọn, trả thơng báo lỗi nếu có.

Ví dụ:

Các câu lệnh

s = '2.7183 3.1416'; A = sscanf(s,'%f')

Tạo ra véc tơ cột có hai phần tử chứa giá trị của pi và e. 4.2. Các lệnh nhập, xuất dữ liệu 4.2.1. Các lệnh nhập dữ liệu 4.2.1.1. Nhập từ bàn phím: Lệnh input Cú pháp : <tên biến>=input('lời nhắc') <tên biến>=input('lời nhắc', 's')

<tên biến>=Input('lời nhắc') Sẽ hiển thị lời nhắc và chờ người dùng nhập dữ liệu, các

dữ liệu này sẽ được gán cho <tên biến>.

<tên biến>=Input('lời nhắc', 's') thường dùng khi nhập chuỗi: nếu dùng cú pháp thứ

nhất để nhập chuỗi thì ta cần đặt chuỗi trong dấu ' ', cịn ở cú pháp 2 ta có thể nhập trực tiếp nội dung của chuỗi. (adsbygoogle = window.adsbygoogle || []).push({});

Chú ý:

Nếu ta ấn enter khi xuất hiện lời nhắc, Matlab sẽ trả kết quả là ma trận rỗng. Để xuống dịng ta sử dụng dấu '\n'.

Ví dụ:

Khi nhập dòng lệnh: s=input('nhập giá trị x= '), máy đưa ra lời nhắc

nhập giá trị x= và chờ ta nhập giá trị. Nếu ta gõ 5, máy sẽ gán giá trị 5 cho biến s

4.2.1.2. Nhập từ hộp thoại: Lệnh inputdlg Cú pháp: answer = inputdlg(prompt) answer = inputdlg(prompt,title) answer = inputdlg(prompt,title,lineNo) answer = inputdlg(prompt,title,lineNo,defAns)

Prompt: là các dòng nhắc trên các trường dữ liệu, được nhập ở dạng mảng khối

các chuỗi lời nhắc

Title: là tiêu đề của hộp thoại, nhập vào ở dạng chuỗi

LineNo: là số nguyên quy định số dòng cho mỗi trường nhập dữ liệu DefAns: là một mảng khối các chuỗi gán giá trị mặc định

Các dữ liệu nhập vào được gán cho answer dưới dạng mảng khối các chuỗi

Ví dụ

prompt = {'Enter matrix size:','Enter colormap name:'}; title = 'Input for peaks function';

lines= 1;

answer = inputdlg(prompt,title,lines,def); Sẽ đưa ra hộp thoại:

Hình 4.1. Hộp thoại lệnh inputdlg

Nếu nhập ở hai hộp các giá trị 40 và red, sau đó nháy OK, ta nhận được: answer={'20' 'red'}

Chú ý:

Kết quả nhập vào được gán cho biến ở dạng mảng khối các chuỗi, chính vì vậy để có thể sử dụng được các giá trị này ta phải dùng hàm char để chuyển đổi về mảng thơng thường, sau đó dùng các hàm sscanf hoặc eval để chuyển dữ liệu về dạng số.

4.2.1.3. Nhập dữ liệu từ tệp: Lệnh fread Cú pháp:

[A,count] = fread(fid,size,precision)

- Dữ liệu đọc được sẽ ghi vào mảng A, count sẽ ghi lại số phần tử được đọc - Fid là chỉ số của tệp được mở lấy ra từ lệnh fopen

- Size : định dạng số phần tử được lấy ra

n : Đọc n phần tử và ghi ra ở dạng véc tơ cột.

inf : Đọc đến cuối mảng, các phần tử đưa vào ma trận cột.

[m,n] :Đọc đủ số phần tử để điền vào ma trận m x n , các phần tử

điền vào theo trật tự các cột, nếu không đủ số phần tử điền, máy thêm vào phần tử 0.

- Preciscion:

Bảng 4.7. Ý nghĩa precision trong lệnh fread

'char' Character; 8 bits (adsbygoogle = window.adsbygoogle || []).push({});

'schar' Signed character; 8 bits

'uchar' Unsigned character; 8 bits

'int8' Integer; 8 bits

'int32' Integer; 32 bits

'int64' Integer; 64 bits

'uint8' Unsigned integer; 8 bits

'uint16' Unsigned integer; 16 bits

'uint32' Unsigned integer; 32 bits

4.2.1.4. Mở tệp để ghi hoặc đọc dữ liệu, Lệnh fopen:

Cú pháp: fid = fopen(filename,permission) Permission: quy định chế độ mở, có thể lấy các giá trị:

- 'r': mở ra để đọc

- 'w': mở ra để ghi , nếu tệp đã có, nó sẽ xố tồn bộ nội dung tệp và ghi lại - 'a': mở ra để ghi thêm

Filename: là tên của tệp sẽ mở được đặt trong dấu ' '

Kết quả sẽ trả ra chỉ số của tệp được mở (con trỏ tham chiếu đến tệp) và gán cho biến fid.

4.2.1.5 Lệnh đóng tệp, fclose Cú pháp:

status = fclose(fid), đóng tệp chỉ định

status = fclose('all'), đóng tất cả các tệp đang mở 4.2.1.6 Nhập dữ liệu từ tệp định dạng mã ascci, Lệnh fscanf

Cú pháp:

A = fscanf(fid,format)

[A,count] = fscanf(fid,format,size)

ở cú pháp thứ nhất, fscanf sẽ đọc dữ liệu từ tệp có con trỏ fid theo định dạng quy định bằng chuỗi format.

ở cú pháp thứ hai, size sẽ quy định số phần tử sẽ được đọc, size có thể lấy các giá trị sau:

Bảng 4.8. Giá trị size trong lệnh fscanf

n Đọc n phần tử và trả véc tơ cột

inf Đọc đến cuối tệp và trả kết quả ra véc tơ cột.

[m,n] Đọc đủ số phần tử để điền vào ma trận m x n phần tử. Số phần tử được đọc thành công sẽ được trả cho biến count

Ví dụ: ta có tệp dữ liệu có tên là 'd:\data\dl.dat' có các số liệu sau:

2.675 6.876 4.576 3.456

Đoạn chương trình sau sẽ đọc dữ liệu từ tệp xếp thành ma trận (4,2) và gán cho biến M

f=fopen('d:\data\dl.dat','r'); M=fscanf(f,'%f',[4,2]); fclose(f); 4.2.2. Các lệnh xuất dữ liệu 4.2.2.1. lệnh disp cú pháp: disp(A) (adsbygoogle = window.adsbygoogle || []).push({});

Hiển thị văn bản hoặc mảng

Mô tả

disp(X) Hiển thị giá trị các mảng mà không đưa ra tên mảng, nếu x chứa chuỗi,

chuỗi sẽ được in ra màn hình. 4.2.2.2. Lệnh fprintf Cú pháp: count = fprintf(fid,format,A,...) fprintf(format,A,...) Mô tả

count = fprintf(fid,format,A,...) định dạng các dữ liệu ở phần thực của ma trận A dưới sự điều khiển của chuỗi định dạng 'format' và ghi vào tệp tham chiếu bằng con trỏ 'fid'. Hàm fprintf trả số lượng byte được ghi ra.

- fid là chỉ số của tệp được mở ra để ghi dữ liệu, nhận được từ lệnh fopen. Nếu bỏ qua fid, kết quả sẽ in ra màn hình.

- format là chuỗi quy định định dạng sẽ xuất ra (xem lệnh sprintf)

Một phần của tài liệu Tài liệu ứng dụng máy tính trong thiết kế ô tô (Trang 43 - 61)