it-roy-ru.com

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

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

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

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

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

Вот как отличаются два представления:

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

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

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

    возвращается

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

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

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

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

  • Это разные классы (то есть типы): char versus 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
    
3
gnovice

Строки имеют некоторые накладные расходы, но все равно увеличиваются на 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
2
Gelliant