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) 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) 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).Vector hóa
Một số ví dụ khác
Vector hóa
Một số ví dụ khác