2011-10-19 79 views
7

Trong MATLAB các for vòng lặp sau:Vòng lặp for không lặp

for i = [1:100]' 
    %'// Do something, such as disp(i) 
end 

là không rõ ràng thực sự được thực hiện bởi lặp, thay i trở thành ma trận [1 2 3 ... 100] và " vòng lặp "chỉ được thực thi một lần trên ma trận này i. Bạn có thể xác minh điều này bằng cách in giá trị i hoặc thông tin theo dõi khác. Chỉ có một đường chuyền duy nhất được thực hiện thông qua vòng lặp.

Có thể buộc MATLAB thực hiện vòng lặp chính hãng không? Lý do tôi hỏi là cách tiếp cận trên là tốt cho nhiều trường hợp nhưng đau đớn hơn nhiều khi bạn có vòng lặp lồng nhau cần chạy.

Ví dụ:
Đoạn mã dưới đây sẽ không làm những gì bạn mong đợi nếu bạn nghĩ rằng bạn đã nhận được lặp đi lặp lại thực tế hơn một vòng lặp:

for i = outlier 
    data(i) = median(data(i-100:i+100)) 
end 

Một mong chờ ở mỗi chỉ số outlier này sẽ thay thế dữ liệu (i) với trung bình dữ liệu từ i-100 đến i + 100, nhưng không. Trong thực tế, trung bình trả về một giá trị được tính trên một tập hợp của tất cả các phạm vi mà bạn quan tâm và mọi điểm dữ liệu (i) được thay thế bằng giá trị đơn đó.

+2

Bạn có thể gửi ra rằng tái tạo những gì bạn đang nhìn thấy. Tôi đã không nhìn thấy hành vi này, và tôi đã rất quan tâm đến các vòng lặp trong Matlab. – Iterator

+0

Bạn không có nghĩa là 'trung bình (dữ liệu (i-100: i + 100))'? (với một ':') –

+0

@Clement J. Vâng tôi có. Đã sửa ngay. –

Trả lời

12

Nếu bạn viết

for i = (1:100)' %'# square brackets would work as well 
    doSomething 
end 

vòng lặp được thực hiện chỉ một lần, vì một for -loop lặp trên tất cả cột của bất cứ thứ gì ở bên phải của dấu bằng (nó sẽ lặp 200 lần với một 100-by-200 mảng bên phải của dấu bằng).

Tuy nhiên, trong ví dụ của bạn, bạn có i=[1:100], đánh giá thành vectơ hàng. Do đó, vòng lặp nên thực thi 100x.

Nếu bạn lặp qua một mảng mà có thể nx1 thay vì 1xn, bạn có thể, vì lý do an toàn, hãy viết:

for i = myArray(:)' %'# guarantee nx1, then transpose to 1xn 
end 
+1

+1. Ngoại trừ đoạn cuối: vòng lặp 'i = [1: 100]' (như trong mã giả của OP) thực hiện 100 lần, không phải một lần. –

+0

@AndrewJanke: D'oh! Mistype! – Jonas

7

Điều này không đúng. Mã:

for i=1:100 
    disp(i) 
end 

sẽ in tất cả các giá trị từ 1 đến 100 liên tiếp. Trong khi Matlab không khuyến khích vectơ hóa, bạn chắc chắn có thể sử dụng các vòng lặp truyền thống với kiểu mã hóa bạn đã sử dụng ở trên.

+0

+1 Câu trả lời hay hơn. :) Tôi chưa bao giờ thấy hành vi được mô tả bởi OP, và tôi chú ý khá nhiều đến các lần lặp (lưu ý tên người dùng ...). Tôi không chắc chắn những gì có thể được đằng sau hành vi được báo cáo. – Iterator

+5

Biến 'outlier' của anh ta có thể là một vectơ cột. Các vòng lặp 'for' của Matlab lặp qua các cột của một cái gì đó, chứ không phải các phần tử. Đối với các vectơ hàng như [1: 100] thì nó giống nhau; nhưng 'for i = [1: 100] '' sẽ thực hiện một lần. –

+1

@Iterator: Hành vi xảy ra nếu mảng là nx1 thay vì 1xn. – Jonas

Các vấn đề liên quan