Проблемы с функцией Matlab strcat с пробелами - PullRequest
28 голосов
/ 15 сентября 2009

Я пытаюсь сделать это:

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

Я ожидал увидеть «красно-желтый белый», однако, я вижу «redyellowwhite» на выходе команды. Что необходимо сделать, чтобы обеспечить правильное сцепление пространств? Заранее спасибо.

Ответы [ 5 ]

21 голосов
/ 15 сентября 2009

Хотя STRCAT игнорирует конечный пробел, он все равно сохраняет ведущий пробел. Попробуйте это:

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

В качестве альтернативы вы можете просто использовать синтаксис конкатенации:

['red ' 'yellow ' 'white ']
21 голосов
/ 15 сентября 2009

На странице справки matlab для strcat:

"strcat игнорирует завершающие символы пробела ASCII и пропускает все такие символы в выводе. Символами пробела в ASCII являются пробел, символ новой строки, возврат каретки, табуляция, вертикальная табуляция или символы перевода страницы, все из которых возвращают true ответ от функции MATLAB isspace. Используйте синтаксис конкатенации [s1 s2 s3 ...] для сохранения конечных пробелов. strcat не игнорирует входные данные, которые являются массивами ячеек строк. "

13 голосов
/ 19 марта 2011

На самом деле, вы можете просто использовать ASCII-код пространства: 32. Таким образом, вы можете решить проблему следующим образом:

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

Тогда вы получите str = 'red yellow white'.

11 голосов
/ 22 сентября 2009

Вы можете защитить конечные пробелы в strcat () или аналогичных функциях, поместив его в ячейку.

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

Не очень полезно в этом базовом примере. Но если в итоге вы выполняете «векторизованные» операции над строками, это удобно. Обычная конкатенация массивов не выполняет конкатенацию 1-ко-многим, что делает strcat.

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

Вставка «my» в ячейку, даже если это одна строка, сохранит пробел. Обратите внимание, что вы должны использовать форму {} вместо вызова cellstr (), которая сама удалит конечные пробелы.

Возможно, это связано с тем, что Matlab имеет две формы представления списков строк: в виде массива cellstr, где все пробелы значимы, и в виде двумерного массива char с заполнением пробелом, каждая строка которого рассматривается как строка завершающий пробел игнорируется. Форма cellstr больше всего напоминает строки в Java и C; форма двумерного символа может быть более эффективной при использовании памяти, если у вас много строк одинаковой длины. Функции манипулирования строками в Matlab полиморфны в двух представлениях и иногда демонстрируют различия, подобные этой. Символьный литерал, такой как 'foo', является вырожденным однострочным регистром двумерной символьной формы, и функции Matlab обрабатывают его так.

1 голос
/ 15 сентября 2009

или вы можете сказать:

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