2013-04-19 27 views
15

Giả sử rằng tôi muốn tạo 10 biến mà sẽ trông như thế này:Tạo biến với những cái tên từ chuỗi

x1 = 1; 
x2 = 2; 
x3 = 3; 
x4 = 4; 
. 
. 
xi = i; 

Đây là một phiên bản đơn giản của những gì tôi đang có ý định làm. Về cơ bản tôi chỉ muốn lưu các dòng mã bằng cách tạo các biến này một cách tự động. Có khả năng để xây dựng một tên biến trong Matlab? Mẫu trong ví dụ của tôi sẽ là ["x", num2str(i)]. Nhưng tôi không thể tìm thấy một cách để tạo ra một biến với tên đó.

+3

Xem MATLAB FAQ: [Làm thế nào tôi có thể tạo biến A1, A2, ..., A10 trong một vòng lặp?] (Http://matlab.wikia.com/wiki/FAQ#How_can_I_create_variables_A1.2C_A2.2C....2CA10_in_a_loop .3F) – Amro

Trả lời

28

Bạn có thể làm điều đó với eval nhưng bạn thực sự nên không

eval(['x', num2str(i), ' = ', num2str(i)]); %//Not recommended 

Thay sử dụng một mảng di động:

x{i} = i 
+0

Wow cảm ơn, rất đơn giản. Và có, tôi sẽ sử dụng các tế bào nhưng cũng có phương pháp này bạn trình bày ở đây;) – Cat

+12

Tôi thực sự không khuyến khích bạn sử dụng eval để bật biến gia tăng trong không gian làm việc của bạn. Nếu bạn muốn một tên tạo cấu trúc: 's. (Sprintf ('x% d', i)) = i;' – Oleg

+0

tại sao điều này không được khuyến cáo? –

5

Tôi cũng khuyên sử dụng một mảng di động hoặc một cấu trúc cho ví dụ các trường hợp. Tôi nghĩ rằng nó thậm chí sẽ cung cấp cho bạn một số tăng hiệu suất.

Nếu bạn thực sự cần phải làm như vậy, Dan đã nói như thế nào. Nhưng tôi cũng muốn trỏ đến hàm genvarname. Nó sẽ đảm bảo chuỗi của bạn là một tên biến hợp lệ.

EDIT: genvarname là một phần của matlab lõi và không thuộc về số liệu thống kê hộp công cụ

+0

Cảm ơn. Tôi sẽ sử dụng các mảng thay vì các ô. Ví dụ trong câu hỏi của tôi rất đơn giản để có một câu hỏi dễ dàng cho thông tin mà tôi đang tìm kiếm. Những gì tôi đang thực sự làm không phải là ngây thơ như câu hỏi của tôi: p – Cat

+0

@bdecaf: btw 'genvarname' là một phần của lõi MATLAB – Amro

+0

oh xấu của tôi. Tôi có thể thề là một phần của hộp công cụ đó. – bdecaf

1

Nếu bất cứ ai khác quan tâm, cú pháp đúng từ câu trả lời của Dan sẽ là:

eval(['x', num2str(i), ' = ', num2str(i)]); 

Câu hỏi của tôi đã chứa các sai cú pháp, vì vậy đó là lỗi của tôi.

+3

Trong tương lai, bạn thực sự có thể chỉnh sửa câu trả lời của tôi nếu có những sai lầm nhỏ như thế này. Có một liên kết chỉnh sửa ở dưới cùng. Nếu bạn không có đủ danh tiếng, bạn cũng có thể để lại nhận xét và người khác sẽ chỉnh sửa cho bạn. Tôi đã sửa lỗi của tôi ngay bây giờ;) – Dan

0

Tôi cần một cái gì đó như thế này vì bạn không thể tham khảo cấu trúc (hoặc mảng ô tôi đoán) từ không gian làm việc trong khối Simulink nếu bạn muốn có thể thay đổi chúng trong khi mô phỏng.

Dù sao, đối với tôi đây làm việc tốt nhất

assignin('base',['string' 'parts'],values); 
4
for k=1:10 
    assignin('base', ['x' num2str(k)], k) 
end 
+0

đề xuất thay đổi 'cơ sở' thành 'người gọi'. Bằng cách đó, AIUI, nó phải làm việc ở bất cứ nơi nào mà ai đó không chú ý cụ thể đến không gian làm việc. – Flyto

1

Mặc dù nó là quá muộn, tôi justed muốn thêm câu trả lời khác.

chức năng genvarname là chính xác cho những trường hợp này

và nếu bạn sử dụng nó với một mảng cấu trúc tmp bạn không cần eval cmd

ví dụ 4 từ liên kết này là làm thế nào để làm điều đó http://www.mathworks.co.uk/help/matlab/ref/genvarname.html

for k = 1:5 
    t = clock; 
    pause(uint8(rand * 10)); 
    v = genvarname('time_elapsed', who); 
    eval([v ' = etime(clock,t)']) 
    end 

mọi điều tốt đẹp

Eyal