Проблемы с функцией Matlab strcat с пробелами

StackOverflow https://stackoverflow.com/questions/1425226

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Кроме того, вы можете просто использовать синтаксис конкатенации:

['red ' 'yellow ' 'white ']

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

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

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

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

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

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

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

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

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

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

str = sprintf('%s%s%s', 'red ', 'yellow ', 'white ')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top