2017-02-08 9 views

ответ

6

documentation suggests:

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

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

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

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

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

    возвращает

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

Лучшее место для начала для понимания разницы является the documentation. Основное различие, как указано здесь:

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

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

  • Они разные классы (т.е. типов): 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 объектов не могут быть использованы в качестве dynamic field names for structure indexing:

    >> 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 
    
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