В чем разница между строками и символами в 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
.
рисунок создается с помощью:
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