2009-09-15 17 views
26

que estoy tratando de lograr esto:Matlab problemas de función strcat con espacios

strcat('red ', 'yellow ', 'white ') 

que esperaba ver "rojo amarillo blanco", sin embargo, veo "redyellowwhite" en la salida del comando. ¿Qué se debe hacer para garantizar que los espacios se concatenan correctamente? Gracias por adelantado.

+3

@ # $ @! # $ @! Otra inconsistencia entre Matlab y C.> :( –

+0

Solución rápida: 'cstrcat (" he "," l "," lo ")', conserva los espacios. Fuente: http://stackoverflow.com/a/14025999/ 445131 –

+0

¡Hay tantas decisiones idiotas de diseño en Matlab, pero no esperaba que algo tan simple como esto también fuera un problema! – houbysoft

Respuesta

20

Desde la página de ayuda de MATLAB para strcat:.

"strcat ignora arrastrar caracteres de espacio en blanco ASCII y omite todos estos caracteres de la salida de caracteres de espacio en blanco en ASCII son el espacio, nueva línea, retorno de carro, tabulador, tabulador vertical o caracteres de alimentación de formulario, todos los cuales devuelven una respuesta verdadera de la función isspace de MATLAB. Use la sintaxis de concatenación [s1 s2 s3 ...] para conservar los espacios finales. strcat no ignora las entradas que son matrices de celdas de cadenas. "

20

Aunque STRCAT ignora posterior espacio en blanco, todavía conserva espacios en blanco. Prueba esto:

strcat('red',' yellow',' white') 

Como alternativa, sólo puede utilizar la sintaxis de concatenación:

['red ' 'yellow ' 'white '] 
1

o se puede decir:

str = sprintf('%s%s%s', 'red ', 'yellow ', 'white ') 
11

se pueden proteger contra las espacios en blanco en strcat() o similar funciones al ponerlo en una celda.

str = strcat({'red '}, {'yellow '}, {'white '}) 
str = str{1} 

No es muy útil en este ejemplo básico. Pero si terminas haciendo operaciones "vectorizadas" en las cuerdas, es útil. La concatenación regular de matrices no hace la concatenación de 1 a muchos que hace strcat.

strs = strcat({'my '}, {'red ','yellow ','white '}, 'shirt') 

Pegar 'mi' en una celda a pesar de que es una sola cadena conservará el espacio en blanco. Tenga en cuenta que debe usar el formulario {} en lugar de llamar a cellstr(), que a su vez eliminará el espacio en blanco al final.

Probablemente todo esto se debe a que Matlab tiene dos formas de representar listas de cadenas: como una matriz de celdas, donde todos los espacios en blanco son significativos y como una matriz de caracteres en dos dimensiones, con cada fila tratada como una cadena, y el espacio en blanco al final ignorado. La forma de celltr más se asemeja a cadenas en Java y C; la forma de charla 2-D puede ser más eficiente desde el punto de vista de la memoria si tiene muchas cadenas de longitud similar. Las funciones de manipulación de cadenas de Matlab son polimórficas en las dos representaciones, y algunas veces muestran diferencias como esta. Un literal char como 'foo' es un caso degenerado de una cadena de la forma de char 2-D, y las funciones de Matlab lo tratan como tal.

+1

Genial, eso me ayudó cuando quería concatenar varias matrices de celdas de cadena con un carácter '''': 'dateTime {:} = strcat (date, {''}, time)' – quazgar

+0

Esto también me ha ayudado a preservar el espacio en blanco . Buen truco para saber. Por cierto, estás muy cerca (si no ya) de 1k para la etiqueta MATLAB. Primeras felicitaciones por obtener el oro :) – rayryeng

+0

Gran consejo. Solo estaba buscando esto. – chengvt

13

De hecho, sólo tiene que utilizar el código ASCII del espacio: 32. Por lo tanto, se puede resolver el problema como este:

str = strcat('red', 32, 'yellow', 32, 'white'); 

por lo que recibirá str = 'red yellow white'.

+2

Guau, divertido que esto funcione, aunque 'strcat ('rojo', '', 'amarillo', '', 'blanco')' elimina los espacios ... –