2010-02-18 39 views
27

¿Cómo anexar una cadena a una columna de la matriz de Matlab?Anexar cadena a la matriz de Matlab

Aquí es un pequeño fragmento de código de lo que estoy tratando de hacer:

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

Respuesta

79

Debe usar matrices de celdas. Si el número de iteraciones son conocidos de antemano, le sugiero que asignar previamente:

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

lo contrario se puede hacer algo como:

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

Vaya, gracias por la sintaxis {end + 1}, ni siquiera sabía que existía "fin" en ese contexto. –

+2

Sí {end + 1} es mucho mejor que {length (..) + 1}! –

-2

Usted va de la manera correcta. Use {} para construir una matriz de celdas, como esta

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

debe hacer lo que quiera.

+0

El uso de {...} para construir iterativamente así terminará con una matriz anidada como un árbol o una lista Lisp, no un cellstr. ¿Qué tal "strs = {'a string'}; para i = 1: 3; strs = [strs; {new_string (i)}]; end" or "... strs {end + 1} = new_string (i) ; ... "? –

4

Como se indicó en otra parte, en MATLAB todas las cadenas de una matriz deben tener la misma longitud. Para tener cadenas de diferentes longitudes, use una matriz de celdas:

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

que funciona para mí. ¡¡Gracias!! – Name

9

Como han dicho en otras respuestas, utilizando cell arrays es probablemente el método más sencillo, lo que dará como resultado que su variable name sea una matriz de celdas donde cada elemento de celda contiene una cadena.

Sin embargo, hay otra opción que usa la función STRVCAT, que concatena cadenas de forma vertical. En lugar de crear una matriz de celdas, esto creará una matriz de caracteres 2D con cada fila conteniendo una cadena. STRVCAT almohadillas automáticamente los extremos de las cadenas con espacios si es necesario para llenar correctamente las filas de la matriz:

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

S = 

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

Si está utilizando dos matrices, como a continuación (A y B) puede anexar ellos como lo lo haces con otras matrices.

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

Result = 

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

sé que este es un hilo viejo, pero parece como si ni siquiera necesita un bucle si esto es todo lo que está haciendo en el bucle. ¿Podrías usar una concatenación vertical?

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

    mmm = [mmm; temp] 

mmm = 

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

Uso strcat función para anexar utilizando el código de una línea sin necesidad de utilizar bucle:

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

A = 'alimento' 'banana' 'naranja'

A = strcat(A,'s') 

A = 'alimentos' 'plátanos' 'naranjas'

+0

más 1; ¡Gracias! ¡No sabía que 'strcat' funciona para una concatenación de tamaño desigual! –

1

Para completar, también se debe mencionar el nuevo string class introducido en MATLAB R2016b; un contenedor para datos de texto junto con un conjunto de funciones para facilitar la manipulación del texto.

compararlo contra mi other example, aquí es cómo asignar un string array:

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

Y aquí es cómo ampliar de forma dinámica la matriz sin preasignación:

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

(Por supuesto, si las cadenas son todas iguales o forman una secuencia con un patrón, hay mejores maneras de crear la matriz sin un bucle. Lo anterior fue solo un ejemplo de cómo llenar la matriz una a una).

El contenedor string también puede convertir a/de character arrays y cell arrays of chars.