В чем разница между строками и символами в Matlab?

в чем разница между строкой и классом символов в MATLAB?

a = 'AX'; % This is a character.
b = string(a) % This is a string.

3 ответов


The документация предполагает:

существует два способа представления текста в MATLAB®. Текст можно хранить в массивах символов. Обычно используется для хранения коротких фрагментов текста в качестве векторов символов. И начиная с выпуска 2016b, вы также можете хранить несколько фрагментов текста в строковых массивах. Строковые массивы предоставляют набор функций для работы с текстом в качестве данных.

вот как два представления differ:

  • доступ к элементу. Представлять char векторы разной длины, нужно было использовать cell массивы, например,ch = {'a', 'ab', 'abc'}. Со строками, они могут быть созданы в реальных массивах: str = [string('a'), string('ab'), string('abc')]. Однако ... --23-->символы индекса в строковом массиве напрямую должна использоваться фигурная скобочная нотация:

    str{3}(2) % == 'b'
    
  • использование памяти. Символы используют ровно столько байтов, сколько символов. stringесть накладные расходы:

    a = 'abc'
    b = string('abc')
    whos a b
    

    возвращает

    Name      Size            Bytes  Class     Attributes
    
     a         1x3                 6  char                
     b         1x1               132  string
    

лучшее место, чтобы начать Для понимания разницы составляет документация. Ключевое отличие, как указано там:

  • массив символов-это последовательность символов, так же как числовой массив-это последовательность чисел. Обычно используется для хранения коротких фрагментов текста в качестве векторов символов, таких как c = 'Hello World';.
  • строковый массив-это контейнер для фрагментов текста. Строковые массивы предоставляют набор функций для работы с текст как данные. Чтобы преобразовать текст в строковые массивы, используйте .

вот еще несколько ключевых моментов об их различиях:

  • это разные классы (типы): char и string. Таким образом, они будут иметь различные наборы методов, определенных для каждого. Подумайте о том, какие операции вы хотите сделать с текстом, а затем выберите тот, который лучше всего поддерживает те.
  • С string является классом контейнера, помните, как его размер отличается от эквивалентного представления массива символов. Используя Ваш пример:

    >> a = 'AX'; % This is a character.
    >> b = string(a) % This is a string.
    >> whos
      Name      Size            Bytes  Class     Attributes
    
      a         1x2                 4  char                
      b         1x1               134  string
    

    заметил, что string контейнер перечисляет свой размер как 1x1 (и занимает больше байтов в памяти), в то время как массив символов, как следует из его имени,1x2 массив символов.

  • их не всегда можно использовать взаимозаменяемо, и вам может потребоваться преобразовать между двумя для определенных операций. Например, string объекты не могут использоваться как имена динамических полей для индексирования структуры:

    >> s = struct('a', 1);
    >> name = string('a');
    >> s.(name)
    Argument to dynamic structure reference must evaluate to a valid field name.
    
    >> s.(char(name))
    
    ans =
    
         1
    

строки имеют немного накладных расходов, но все же увеличиваются на 2 байта на символ. После каждых 8 символов увеличивается размер переменной. Красная линия y=2x+127.

string class

рисунок создается с помощью:

v=[];N=100;
for ct = 1:N
    s=char(randi([0 255],[1,ct]));
    s=string(s);
    a=whos('s');v(ct)=a.bytes;
end
figure(1);clf
plot(v)
xlabel('# characters')
ylabel('# bytes')
p=polyfit(1:N,v,1);
hold on
plot([0,N],[127,2*N+127],'r')
hold off