2012-03-22 48 views
10

Tôi muốn tạo một vòng lặp sẽ lặp qua nhiều chuỗi, nhưng không thể làm như vậy trong Matlab.vòng lặp foreach với các chuỗi trong Matlab

Điều gì làm việc là:

for i=1:3 
    if (i==1) 
    b='cow'; 
    elseif (i==2) 
    b='dog'; 
    else 
    b='cat'; 
    end 

    disp(b); 
end 

và kết quả là:

cow 
dog 
cat 

Nhưng những gì tôi muốn là một cái gì đó tao nhã hơn mà sẽ trông giống như:

for i=['cow','dog','cat'] 
    disp (i); 
end 

và cung cấp cho các cùng một kết quả.

Có tùy chọn nào trong Matlab để thực hiện việc này không?

ADDITION:

tôi cần những lời như dây đàn sau này để sử dụng và không chỉ để hiển thị (các disp đã được chỉ là một ví dụ). Tôi đã cố gắng sử dụng các mảng di động trong chương trình thật của tôi:

clear all; 
close all; 
clc; 

global fp_a 
global TEST_TYPE 
global SHADE_METHODE 

for fp_a=11:24 
for shade={'full','fast'} 
    SHADE_METHODE=shade(1); 
    for test={'bunny','city'} 
     TEST_MODE=test(1); 
     fprintf ('fp_a:%d | test: %s | shade: %s',fp_a,TEST_TYPE,SHADE_METHODE); 
     ray_tracing; 
    end 
end 
end 

Nó không làm việc như các giá trị ở lại như tế bào và không dây Tôi nhận được thông báo lỗi:

??? Lỗi khi sử dụng ==> fprintf Chức năng không được xác định cho đầu vào 'ô'.

* -Tôi không thực sự cần fprintf Tôi chỉ sử dụng nó để kiểm tra xem các giá trị có đúng không.

** - ray_tracing là mã của tôi sử dụng giá trị của các chuỗi

+2

Sự cố trong phần bổ sung chỉ là cú pháp. Bạn cần sử dụng dấu ngoặc nhọn - 'test {1}' - để trích mảng char từ ô, không phải dấu ngoặc đơn thông thường - 'test (1)' - chỉ chọn ô đầu tiên trong mảng, không có gì hiệu quả ở đây. Hãy kiểm tra lại mã ví dụ của Oli; lưu ý anh ta đang sử dụng dấu ngoặc nhọn trong 'i {1}'. (Ngoài ra, không sử dụng globals nếu bạn có thể tránh nó.) –

+0

Bạn nên sử dụng 'SHADE_METHODE = bóng râm {1};' thay vì 'SHADE_METHODE = bóng râm (1); ' – Oli

+0

có thể trùng lặp của [Có một foreach trong MATLAB? Nếu vậy, nó hoạt động như thế nào nếu dữ liệu cơ bản thay đổi?] (Http://stackoverflow.com/questions/408080/is-there-a-foreach-in-matlab-if-so-how-does-it-behave -if-the-cơ bản-dữ liệu-c) –

Trả lời

28

Hoặc bạn có thể làm:

for i={'cow','dog','cat'} 
    disp(i{1}) 
end 

Kết quả:

cow 
dog 
cat 
+6

Rất tốt. Nếu chỉ có mọi điều thực sự tốt đẹp về viết trong Matlab đã không được bù đắp bởi một cái gì đó thực sự khủng khiếp. – beOn

2

Chắc chắn! Sử dụng mảng ô để giữ chuỗi (trong mảng bình thường, chuỗi được xem xét theo ký tự, có thể hoạt động nếu tất cả các chuỗi có cùng độ dài, nhưng sẽ bork khác).

opts={'cow','dog','cat'} 
for i=1:length(opts) 
    disp(opts{i}) 
end 
5

vấn đề của bạn có lẽ do cách MATLAB xử lý chuỗi. Chuỗi MATLAB chỉ là mảng ký tự. Khi bạn gọi ['cow','dog','cat'], bạn đang tạo thành 'cowdogcat'[] ghép các mảng mà không có bất kỳ lồng nào. Nếu bạn muốn có hành vi lồng nhau, bạn có thể sử dụng các mảng ô được xây dựng bằng cách sử dụng {}. for lặp qua các cột bên tay phải của nó. Điều này có nghĩa là bạn có thể sử dụng thành ngữ bạn đã đề cập ở trên; Oli đã cung cấp một giải pháp rồi. Thành ngữ này cũng là một cách tốt để giới thiệu sự khác biệt giữa mảng bình thường và ô.

%Cell array providing the correct solution 
for word = {'cow','dog','cat'} 
    disp(word{1}) %word is bound to a 1x1 cell array. This extracts its contents. 
end 

cow 
dog 
cat 


%Normal array providing weirdness 
for word = ['cow','dog','cat'] %Same as word = 'cowdogcat' 
    disp(word) %No need to extract content 
end 

c 
o 
w 
d 
o 
g 
c 
a 
t 
Các vấn đề liên quan