2010-02-18 39 views
27

Làm cách nào để nối chuỗi vào cột mảng Matlab một cách khôn ngoan?Nối chuỗi vào mảng Matlab

Đây là một đoạn mã nhỏ của những gì tôi đang cố gắng để làm:

for_loop 
    filename = 'string'; 
    name=[name; filename] 
end 

Trả lời

79

Bạn cần sử dụng mảng ô. Nếu số lần lặp được biết trước, tôi đề nghị bạn preallocate:

N = 10; 
names = cell(1,N); 
for i=1:N 
    names{i} = 'string'; 
end 

nếu không bạn có thể làm điều gì đó như:

names = {}; 
for i=1:10 
    names{end+1} = 'string'; 
end 
+14

Chà, cảm ơn cú pháp {end + 1}, tôi thậm chí còn không biết "kết thúc" tồn tại trong ngữ cảnh đó. –

+2

Có {end + 1} tốt hơn nhiều so với {length (..) + 1}! –

-2

Bạn đang đi đúng đường. Sử dụng {} để tạo mảng ô, như thế này

stringtable = 'a string'; 
for i = 1:3 
    stringtable = {stringtable;new_string(i)} 
end 

nên làm những gì bạn muốn.

+0

Sử dụng {...} để xây dựng lặp đi lặp lại như thế này sẽ kết thúc với một mảng ô lồng nhau như một cây hoặc danh sách Lisp, không phải là một ô. Làm thế nào về "strs = {'a string'}; cho i = 1: 3; strs = [strs; {new_string (i)}]; kết thúc" hoặc "... strs {end + 1} = new_string (i) ; ... "? –

4

Như đã lưu ý ở nơi khác, trong MATLAB tất cả các chuỗi trong một mảng phải có cùng độ dài. Để có các chuỗi có độ dài khác nhau, hãy sử dụng mảng ô:

name = {}; 
for i = somearray 
    name = [name; {string}]; 
end 
+0

phù hợp với tôi. Cảm ơn!! – Name

9

Như câu trả lời khác đã lưu ý, sử dụng cell arrays có lẽ là phương pháp đơn giản nhất, điều này sẽ dẫn đến biến của bạn name là một mảng ô nơi mỗi phần tử ô chứa một chuỗi.

Tuy nhiên, có một tùy chọn khác sử dụng hàm STRVCAT, sẽ nối các chuỗi theo chiều dọc. Thay vì tạo một mảng ô, điều này sẽ tạo một ma trận ký tự 2-D với mỗi hàng chứa một chuỗi. STRVCAT tự động miếng tận cùng dây với không gian nếu cần thiết để lấp đầy một cách chính xác các hàng của ma trận:

>> string1 = 'hi'; 
>> string2 = 'there'; 
>> S = strvcat(string1,string2) 

S = 

hi 
there 
3
name=[]; 
for_loop 
    filename = 'string'; 
    name=[name; {filename}]; 
end 
1

Nếu bạn đang sử dụng hai mảng như dưới đây (A và B), bạn có thể thêm chúng như những gì bạn làm với các ma trận khác.

A = {'a' ; 'b' ; 'c'}; 
B = {'1' ; '2' ; '3'}; 
Result = { A{:,1} ; B{:,1} } 

Result = 

'a' 'b' 'c' 
'1' '2' '3' 
0

Tôi biết rằng đây là một chuỗi cũ, nhưng có vẻ như bạn thậm chí không cần vòng lặp nếu đây là tất cả những gì bạn đang làm trong vòng lặp. Bạn có thể chỉ sử dụng một nối dọc?

mmm = {'str1'; 'str2'; 'str3'}; 
    temp = {'a'; 'b'; 'c'}; 

    mmm = [mmm; temp] 

mmm = 

    'str1' 
    'str2' 
    'str3' 
    'a' 
    'b' 
    'c' 
2

Sử dụng strcat chức năng để thêm cách sử dụng mã một dòng mà không sử dụng vòng lặp:

A={'food','banana','orange'} 

A = 'food' 'chuối' 'cam'

A = strcat(A,'s') 

A = 'thực phẩm' 'chuối' 'cam'

+0

cộng 1; cảm ơn! Không biết 'strcat' hoạt động cho ghép nối không đồng đều! –

1

Để hoàn tất, bạn cũng nên đề cập đến string class mới được giới thiệu trong MATLAB R2016b; một vùng chứa dữ liệu văn bản cùng với một tập hợp các hàm để thao tác văn bản dễ dàng.

Để so sánh nó với tôi other example, đây là làm thế nào để phân bổ một string array:

N = 10; 
names = strings(1,N); 
for i=1:N 
    names(i) = 'string'; 
end 

Và đây là làm thế nào để tự động mở rộng mảng mà không preallocation:

names = strings(0); 
for i=1:10 
    names(end+1) = 'string'; 
end 

(Tất nhiên nếu các chuỗi là tất cả giống nhau hoặc tạo thành một chuỗi với một mẫu, có những cách tốt hơn để tạo mảng mà không có vòng lặp. Ở trên chỉ là một ví dụ về việc lấp đầy mảng từng cái một).

Vùng chứa string cũng có thể chuyển đổi thành/từ character arrayscell arrays of chars.