Vector hóa (Vectorization)

Nội dung

1 Mở đầu

2 Các thủ tục

3 Các hàm m-file

4 Nhập, xuất dữ liệu

5 Điều khiển luồng

6 Vector hóa (Vectorization)

7 Quản lý các biến Input, Output

8 Tính giá trị hàm một cách gián tiếp

9 Chú thích

10 Gỡ lỗi

11 Một số kinh nghiệm trong lập trình Matlab

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

53/87

53 / 87

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa

Vector hóa là việc sử dụng các phép toán vector để xử lý toàn bộ các phần tử của một vector hay ma trận. Thật ra các biểu thức vector hóa là tương đương với phép lặp trên các phần tử của ma trận hay vector. Biểu thức vector hóa sẽ ngắn gọn và thực thi nhanh hơn các biểu thức lặp thông thường. Sử dụng các phép toán vector thay cho vòng lặp khi có thể Tiền cấp phát bộ nhớ cho các vector hay ma trận Sử dụng việc đánh chỉ mục vector hóa và các hàm logic

Mã không sử dụng vector hóa gọi là mã vô hướng (scalar code) bởi vì các phép toán được thực hiện trên các phần tử vô hướng của vector hay ma trận thay vì toàn bộ.

Lời khuyên

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

54/87

54 / 87

Chương trình tuy chậm mà chính xác còn hơn chương trình nhanh mà không chính xác. =⇒ Bắt đầu với các mã vô hướng, sau đó vector hóa nếu cần

Vector hóa (Vectorization)

Vector hóa Thay thế vòng lặp bởi các phép toán vector

Mã vô hướng x=... for k=1:length(x) y(k)=sin(x(k)); end

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

55/87

55 / 87

Mã vector hóa tương đương x=... y=sin(x);

Vector hóa (Vectorization)

Vector hóa Tiền cấp phát bộ nhớ

Vòng lặp sau sẽ tăng chiều của s sau mỗi lần lặp Tiền cấp phát cho s trước khi gán các giá trị cho các thành phần

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

56/87

56 / 87

y=[4 -1 9 0]; for j=1:length(y) if y(j)>0 y=[4 -1 9 0]; s=zeros(size(y)); for j=1:length(y) if y(j)>0 s(j)=sqrt(y(j)); s(j)=sqrt(y(j)); else end s(j)=0; end end end

Vector hóa (Vectorization)

Vector hóa Đánh chỉ mục vector hóa và các hàm logic

Việc vector hóa mã hoàn toàn đòi hỏi việc sử dụng việc đánh chỉ số mảng (array indexing) và đánh chỉ số logic (logical indexing).

Đánh chỉ số mảng

>> x=sqrt(0:4:20) x = 2.0000 2.8284 3.4641 4.0000 4.4721 0

>> i=[1 2 5]; >> y=x(i) y = 0 2 4

Biểu thức y=x(i) tương đương với đoạn mã

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

57/87

57 / 87

k=0; for i=[1 2 5], k=k+1; y(k)=x(i); end

Vector hóa (Vectorization)

Vector hóa Đánh chỉ mục vector hóa và các hàm logic

Đánh chỉ số logic

>> x=sqrt(0:4:20) x = 2.0000 2.8284 3.4641 4.0000 4.4721 0

>> j=find(rem(x,2)==0) j = 1 2 5

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

58/87

58 / 87

>> z=x(j) z = 0 2 4

Vector hóa (Vectorization)

Vector hóa Đánh chỉ mục vector hóa và các hàm logic

Ví dụ 18

Vector hóa mã vô hướng Xét đoạn mã

y=. . . s=zeros(size(y)); for j=1:length(y) if y(j)>0 s(j)=sqrt(y(j)); end end

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

59/87

59 / 87

Thực ra, có thể thay thế toàn bộ vòng lặp bằng cách sử dụng đánh chỉ số logic hoặc đánh chỉ số mảng.

Vector hóa (Vectorization)

Vector hóa Đánh chỉ mục vector hóa và các hàm logic

Ví dụ (tiếp) y=. . . s=zeros(size(y)); i=find(y>0); s(y>0)=sqrt(y(y>0));

hoặc gọn hơn

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

60/87

60 / 87

y=. . . s=zeros(size(y)); s(y>0)=sqrt(y(y>0));

Vector hóa (Vectorization)

Vector hóa Vector hóa các phép sao chép

Sao chép toàn bộ các cột (hàng)

Mã vô hướng

[m,n]=size(A); % Giả sử rằng A và B có cùng số hàng (cột) for i=1:m B(i,1)=A(i,1); end

Mã vector hóa

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

61/87

61 / 87

B(:,1)=A(:,1);

Vector hóa (Vectorization)

Vector hóa Vector hóa các phép sao chép

Sao chép và chuyển vị các ma trận con

Mã vô hướng

for j=2:3 B(1,j)=A(j,3); end

Mã vector hóa

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

62/87

62 / 87

B(1,2:3)=A(2:3,3);

Vector hóa (Vectorization)

Vector hóa Một số ví dụ khác

Xóa các thành phần của một mảng

Để xóa các thành phần không phải là số (NaN) hoặc giá trị vô cùng (inf) của một mảng x ta có thể dùng đoạn mã sử dụng đánh chỉ số mảng

i=find(isnan(x) | isinf(x)); x(i)=[]; % Find bad elements % and delete them

hay một cách khác

i=find(~isnan(x) & ~isinf(x)); % Find elements that are are not NaN and not infinite x=x(i); % Keep those elements

Ta có thể thay đổi các đoạn mã trên bằng cách sử dụng chỉ số logic

x(isnan(x) | isinf(x))=[]; % Delete bad elements

hoặc

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

63/87

63 / 87

x=x(~isnan(x) & ~isinf(x)); % Keep good elements

Vector hóa (Vectorization)

Vector hóa Một số ví dụ khác

Hàm từng khúc (Piecewise functions) (cid:40) Hàm sinc được định nghĩa bởi sinc(x) = sin(x)/x, x (cid:54)= 0 x = 0. 1, So sánh đoạn mã sử dụng lệnh find

% Set y to all ones, sinc(0)=1; % Find nonzero x values % Compute sinc when x ~=0 function y=sinc(x) y=ones(size(x)); i=find(x~=0); y(i)=sin(x(i))./x(i); end

và một cách viết thú vị khác:

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

64/87

64 / 87

y=(sin(x)+(x==0))./(x+(x==0));

Vector hóa (Vectorization)

Vector hóa Một số ví dụ khác

Nội suy đa thức

n (cid:81) 1≤i

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

65/87

65 / 87

Cho n mốc nội suy x1, x2, . . . , xn và các giá trị hàm tương ứng y1, y2, . . . , yn. Khi đó, các hệ số c0, c1, . . . , cn−1 của đa thức nội suy bậc n − 1 có thể được tính bằng cách giải hệ       · · · · · · 1 1 x2 1 x2 2 xn−2 1 xn−2 2 =                         · · · 1 cn−1 cn−2 ... c0 y1 y2 ... yn x1 x2 ... xn xn−1 1 xn−1 2 ... xn−1 n xn−2 n x2 n hay Ac = y. Hệ trên có định thức Vandermond |A| = (xj − xi) (cid:54)= 0 nên có nghiệm duy nhất.

Vector hóa (Vectorization)

Vector hóa Một số ví dụ khác

Nội suy đa thức

function c=polyinterp(x,y) x = x(:); y=y(:); n = length(x); % Make sure that x and y are both column vectors % n= Number of points

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

66/87

66 / 87

% Make an nxn matrix with x on every column % Make another nxn matrix of exponents % Compute the powers % Solve the matrix equation for coefficients %%% Compute the left-hand side matrix %%% xMatrix = repmat(x,1,n); powMatrix = repmat(n-1:-1:0,n,1); A = xMatrix .^ powMatrix; c=A\y; end

Vector hóa (Vectorization)

Vector hóa Một số ví dụ khác

Nội suy đa thức

Trong chương trình trên, để xây dựng ma trận vế trái A, trước hết tạo ra 2 ma trận n × n của cơ sở và lũy thừa, sau đó sử dụng toán tử lũy thừa từng từ .^. Hàm repmat ("replicate matrix") được sử dụng để tạo ma trận cơ sở xMatrix và ma trận lũy thừa powMatrix:

    x(1) x(2) · · · · · · n − 1 n − 2 n − 1 n − 2 · · · · · · ; powMatrix = xMatrix = ...                 x(1) x(2) ... x(n) x(n) · · · x(1) x(2) ... x(n) n − 1 n − 2 · · · 0 0 ... 0

Ma trận xMatrix được tạo bằng cách lặp lại vector cột x n lần.

(SAMI-HUST)

Lập trình Matlab

Hà Nội, tháng 8 năm 2015

67/87

67 / 87

Ma trận powMatrix được tạo bởi một vector hàng với các thành phần n − 1, n − 2, . . . , 0 lặp lại n lần. Đây chỉ là một ví dụ, có thể sử dụng hàm chuẩn của MatLab polyfit cho một loạt các đa thức nội suy (đọc thêm help để tìm hiểu thêm).