2012-09-28 43 views
6

Tôi có vòng lặp sau đây cho một mã (tính toán biểu đồ). Tôi đang viết ở Matlab. Vì tôi mới làm quen với Matlab, tôi không biết có phương pháp nào nhanh hơn để làm điều này. Tôi hiện đang viếtMATLAB tối ưu hóa cho vòng lặp

for i=1:size(b) 
    a(b(i)) = a(b(i)) + 1; 
end 

Có phương pháp nào nhanh hơn để làm điều này, tốt nhất là những phương pháp không yêu cầu vòng lặp?

+2

nhận xét chung: 'size' không phải là chức năng phù hợp với những gì bạn đang làm bây giờ, thay vì sử dụng [length] (http://www.mathworks.nl/help/matlab/ref/length.html) hoặc [numel] (http://www.mathworks.nl/help/matlab/ref/numel.html). –

+2

Ý tưởng cho các vòng lặp không hiệu quả/chậm và nên được thay thế nếu có thể không được chứng minh. Mặc dù bạn có thể thay thế mã này bằng một cái gì đó nhanh hơn, bạn có thể sẽ chỉ tiết kiệm được một phần nhỏ của một giây. Đây không phải là mức tối ưu hóa mã bạn nên lo lắng. – Kavka

+0

@Kavka Liên quan đến loại vòng lặp này, tôi sẽ đồng ý. Một vòng lặp phức tạp hơn để điều khiển các ma trận lớn sẽ có giá trị vectơ, đúng không? Matlab được thiết kế để làm việc với các Ma trận - tất cả các hoạt động ma trận của nó được cho là được tối ưu hóa. – Derek

Trả lời

9

Bạn chỉ có thể vector hóa nó theo a(b) = a(b) + 1. Kiểm tra như sau:

>> a = [1 2 3 4]; 
>> b = [2 4]; %# indices to modify. Be sure that they are in bounds. 
>> a(b) = a(b) + 1 

a = 

    1  3  3  5 

Nếu bạn sử dụng một số chỉ số nhiều lần, sau đó accumarray sẽ giúp như sau:

>> a = [1 2 3 4]; 
>> b = [2 4 2]; 
>> a = accumarray([1:numel(a) b].',[a ones(size(b))])' 

a = 

    1  4  3  5 

Ngoài ra, bạn có thể sử dụng:

>> a = [1 2 3 4]; 
>> b = [2 4 2]; 
>> b = accumarray(b.',ones(size(b))); 
>> a(nzIndex) = a(nzIndex) + b(nzIndex)' 

a = 

    1  4  3  5 

Xem this nice answer đây để biết thêm chi tiết.

+0

Trong trường hợp của tôi b có thể [2 4 2], để tôi cần tăng (2) hai lần. Phương pháp này cập nhật một (2) chỉ một lần. – anirudh

+0

Tôi đã cập nhật câu hỏi cho phù hợp. – petrichor

1

Nếu cả hai ab là vectơ, điều này sẽ hoạt động.

a = 1:100; 
b = 100:-1:1; 

a(b) = a(b) + 1; 
Các vấn đề liên quan