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
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
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
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.
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) ; ... "? –
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
phù hợp với tôi. Cảm ơn!! – Name
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
name=[];
for_loop
filename = 'string';
name=[name; {filename}];
end
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'
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'
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'
cộng 1; cảm ơn! Không biết 'strcat' hoạt động cho ghép nối không đồng đều! –
Để 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 arrays và cell arrays of chars.
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 đó. –
Có {end + 1} tốt hơn nhiều so với {length (..) + 1}! –