2012-06-06 38 views
11

Tôi có thể viết thông tin sau đây vào một lớp lót không?Đọc danh sách Matlab

x = [1,3,5] 
res = zeros(1,size(x,2)); 
for i=1:size(x,2); 
    res(i) = foo(x(i); 
end; 

Giả sử rằng hàm foo không xử lý mảng như mong đợi. Trong trường hợp của tôi, foo trả về một vô hướng ngay cả khi đưa ra một mảng làm đối số.

Trong Python, ví dụ, nó sẽ trông như thế này:

x = [1,3,5] 
res = [foo(y) for y in x] 

Trả lời

10

arrayfun là những gì bạn cần. Ví dụ:

res = arrayfun(@foo, x) 

Kể từ foo luôn trả về một đại lượng vô hướng, bên trên sẽ làm việc và res cũng sẽ là một vector của các kích thước tương tự như x. Nếu foo trả về kết quả độ dài thay đổi, thì bạn sẽ phải đặt 'UniformOutput' thành false hoặc 0 trong cuộc gọi đến arrayfun. Đầu ra sau đó sẽ là một mảng cell.

+1

"@" làm gì? –

+1

@LucyBrennan Nó tạo ra một [chức năng xử lý] (http://www.mathworks.com/help/techdoc/matlab_prog/brfpxgt-1.html). Bạn có thể đọc trang tài liệu đó và các liên kết liên quan để biết thêm thông tin – abcd

+1

Thx. Điều gì sẽ xảy ra nếu foo thực sự có hai đối số, và tôi muốn giữ cho đối số thứ hai là hằng số trong tất cả các lần lặp? –

6

Chỉ cần để thêm vào câu trả lời tốt của @yoda, thay vì sử dụng UniformOutput, bạn cũng có thể sử dụng dấu ngoặc {}:

res = arrayfun(@(t){foo(t)}, x) 

Ngoài ra, trong một số trường hợp, foo đã được vector hóa.

x = 1:10; 
foo = @(t)(power(t,2)); 
res = foo(x); 
+0

u có thể giải thích chi tiết hơn một chút về 'foo = @ (t) (power (t, 2));' nghĩa là gì? –

+0

vấn đề là gì nếu tôi muốn làm một cái gì đó như '{i^2 for i to N}'? Nhưng tôi không muốn xác định một chức năng cho '^ 2', có một sự thay thế? –

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