web-dev-qa-db-fra.com

Quelle est la différence entre les chaînes et les caractères dans Matlab?

Quelle est la différence entre string et character class dans MATLAB?

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

La documentation suggère :

Il existe deux façons de représenter du texte dans MATLAB®. Vous pouvez stocker du texte dans des tableaux de caractères. Une utilisation typique consiste à stocker de courts morceaux de texte en tant que vecteurs de caractères. Et à partir de la version 2016b, vous pouvez également stocker plusieurs morceaux de texte dans des tableaux de chaînes. Les tableaux de chaînes fournissent un ensemble de fonctions permettant de travailler avec du texte en tant que données.

Voici comment les deux représentations diffèrent:

  • Accès aux éléments . Pour représenter des vecteurs char de longueur différente, il fallait utiliser des tableaux cell, par ex. ch = {'a', 'ab', 'abc'}. Avec les chaînes, elles peuvent être créées dans des tableaux réels: str = [string('a'), string('ab'), string('abc')]. Cependant, pour index des caractères dans un tableau de chaînes directement, la notation des accolades doit être utilisée:

    str{3}(2) % == 'b'
    
  • Utilisation de la mémoire . Les caractères utilisent exactement autant d'octets qu'il y a de caractères. strings ont des frais généraux:

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

    résultats

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

Le meilleur endroit pour commencer à comprendre la différence est la documentation . La principale différence, comme indiqué ici:

  • Un tableau de caractères est une séquence de caractères, tout comme un tableau numérique est une séquence de nombres. Une utilisation typique consiste à stocker de courts morceaux de texte sous forme de vecteurs de caractères, tels que c = 'Hello World';.
  • Un tableau de chaînes est un conteneur pour des morceaux de texte. Les tableaux de chaînes fournissent un ensemble de fonctions permettant de travailler avec du texte en tant que données. Pour convertir du texte en tableaux de chaînes, utilisez la fonction string.

Voici quelques points clés sur leurs différences:

  • Ce sont différentes classes (types): char versus string . En tant que tels, ils auront différents ensembles de méthodes définis pour chacun. Pensez au type d'opérations que vous souhaitez effectuer sur votre texte, puis choisissez celle qui le supporte le mieux.
  • Comme string est une classe de conteneur, n'oubliez pas que sa taille diffère d'une représentation de tableau de caractères équivalente. En utilisant votre exemple:

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

    Notez que le conteneur string indique sa taille en tant que 1x1 (et occupe plus d'octets en mémoire), tandis que le tableau de caractères est, comme son nom l'indique, un tableau de caractères 1x2.

  • Ils ne peuvent pas toujours être utilisés de manière interchangeable et vous devrez peut-être effectuer une conversion entre les deux pour certaines opérations. Par exemple, les objets string ne peuvent pas être utilisés en tant que noms de champs dynamiques pour l'indexation de structure :

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

Les chaînes ont un peu de surcharge, mais augmentent quand même de 2 octets par caractère. Tous les 8 caractères, la taille de la variable augmente. La ligne rouge est y=2x+127

 string class

la figure est créée en utilisant:

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