Theo Brownlees & Gallo 2006 (nếu bạn có thể quan tâm), tôi đang cố gắng loại bỏ các giá trị ngoại lệ khỏi chuỗi dữ liệu trích dẫn.
Mã chạy tốt, nhưng vì tôi đang xử lý các vectơ rất dài (vectơ lớn nhất có 20m quan sát và quá trình tính toán chưa kết thúc sau 20 giờ), tôi muốn biết cách tăng tốc nó.
Những gì tôi đã làm cho đến nay là:
Tôi đã thay đổi định dạng ngày giờ thành số kép và tôi thấy nó tiết kiệm được khá nhiều thời gian xử lý và rất nhiều bộ nhớ.
Tôi đã phân bổ bộ nhớ cho vectơ:
[n] = kích thước(giá);
x = giá;
Score = nan(n,'double'); %using tic và toc Tôi thấy rằng nan cần ít thời gian hơn số không
Trimmed_mean = nan(n,'double');
sd = nan(n,'double');
out_mat = nan(n,'double');
Đây là vòng lặp tôi muốn loại bỏ. Tôi đọc được rằng tốc độ vector hóa tăng lên rất nhiều, đặc biệt là với các vectơ dài.
với i = k+1:n
Trimmed_mean(i) = trimmean(x(ik:i-1 & i+1:i+k),10,'round'); %trimmed trung bình được tính toán trên 'k' quan sát gần nhất với 'i' (i bị loại trừ )
điểm(i) = x(i) - Trimmed_mean(i);
sd(i) = std(x(ik:i-1 & i+1:i+k)); %giống như giá trị trung bình
tmp = abs(score(i)) > (alpha .* sd(i) + gamma);
out_mat(i) = tmp*1;
end
đây là điều tôi muốn làm
Trimmed_mean=trimmean(regroup_matrix,10,'round',2);
Score=bsxfun(@minus,x,trimmed_mean);
sd=std(regroup_matrix,2);
temp = abs(score) > (alpha .* sd + gamma);
out_mat = temp*1;
Nhưng vì tôi mới làm quen với Matlab nên tôi không biết cách xây dựng ma trận quan sát liền kề một cách chính xác. Tôi chỉ nghĩ nó nên có hình dạng như thế này:regroup_matrix= nan (n,2*k)
.
EDIT: Cụ thể, điều tôi muốn làm (nhưng tôi không thể) là:
Cho một vectơ cột "x"(n,1) cho mỗi quan sát "i" trong "x" Tôi muốn đưa "k" các quan sát liền kề đến "i" (từ ik đến i-1 và từ i +1 đến i + k) và coi những quan sát này là các hàng (n, 2*k) của ma trận.
EDIT 2: Tôi đã thực hiện một số thay đổi đối với mã và tôi nghĩ mình đang tiến gần hơn đến giải pháp. Tôi đã đăng một câu hỏi khác giải quyết cụ thể những gì tôi nghĩ là vấn đề hiện tại:
Matlab: Điền các hàng ma trận bằng cách sử dụng các khoảng di chuyển từ vectơ cột không có vòng lặp for
Điều tôi muốn làm bây giờ là:
[n] = kích thước(giá,1);
x = giá;
[j1]=tìm(x);
ma trận_left=số không(n, k,'double');
ma trận_right=số không(n, k,'double');
toc
ma trận_left(j1(k+1:end),:)=x(j1-k:j1-1);
ma trận_right(j1(1:end-k),:)=x(j1+1:j1+k);
ma trận_group=[ma trận_left ma trận_right];
Trimmed_mean=trimmean(matrix_group,10,'round',2);
Score=bsxfun(@minus,x,trimmed_mean);
sd=std(matrix_group,2);
temp = abs(score) > (alpha .* sd + gamma);
outmat = temp*1;
Tôi gặp sự cố khi tạo ma trận_left và ma trận_right. J1 tôi sử dụng để lập chỉ mục là một vectơ cột chứa các chỉ báo theo dõi giá. Đầu ra rất đơn giản
j1=[1:1:n]
giá là một vectơ cột đôi có kích thước (n,1)
Tôi là một lập trình viên xuất sắc, rất giỏi!