cuốn sách gpt4 ai đã làm

matlab - tối ưu hóa mã, xóa "vòng lặp for"

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 20:04:54 27 4
mua khóa gpt4 Nike

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)

câu trả lời hay nhất

Để định hình lại, bạn có thể làm như sau:

idxArray = bsxfun(@plus,(k:n)',[-k:-1,1:k]);
reshapeArray = x(idxArray);

Về matlab - tối ưu hóa mã và loại bỏ "vòng lặp for", chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/21634394/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress