it-swarm.com.de

Was ist der Unterschied zwischen Zeichenfolgen und Zeichen in Matlab?

Was ist der Unterschied zwischen Zeichenkette und Zeichenklasse in MATLAB?

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

Die Dokumentation schlägt vor :

Es gibt zwei Möglichkeiten, Text in MATLAB® darzustellen. Sie können Text in Zeichenarrays speichern. Eine typische Verwendung ist das Speichern kurzer Textstücke als Zeichenvektoren. Ab Release 2016b können Sie auch mehrere Textteile in String-Arrays speichern. String-Arrays bieten eine Reihe von Funktionen zum Arbeiten mit Text als Daten.

So unterscheiden sich die beiden Darstellungen:

  • Elementzugriff . Um char-Vektoren unterschiedlicher Länge darzustellen, musste man cell-Arrays verwenden, z. ch = {'a', 'ab', 'abc'}. Mit Strings können sie in tatsächlichen Arrays erstellt werden: str = [string('a'), string('ab'), string('abc')]. Um jedoch Indexzeichen direkt in einem String-Array zu verwenden, muss die geschweifte Klammer-Notation verwendet werden:

    str{3}(2) % == 'b'
    
  • Speichernutzung . Zeichen verwenden genau so viele Bytes, wie Zeichen vorhanden sind. strings haben Overhead:

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

    kehrt zurück

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

Der beste Ort, um den Unterschied zu verstehen, ist die Dokumentation . Der Hauptunterschied, wie dort angegeben:

  • Ein Zeichenfeld ist eine Folge von Zeichen, genau wie ein Zahlenfeld eine Folge von Zahlen. Eine typische Verwendung ist das Speichern kurzer Textstücke als Zeichenvektoren, z. B. c = 'Hello World';.
  • Ein String-Array ist ein Container für Textteile. String-Arrays bieten eine Reihe von Funktionen zum Arbeiten mit Text als Daten. Verwenden Sie zum Konvertieren von Text in String-Arrays die Funktion string.

Hier noch ein paar wichtige Punkte zu ihren Unterschieden:

  • Sie sind verschiedene Klassen (d. H. Typen): char versus string . Als solche werden für jede unterschiedliche Methoden definiert. Überlegen Sie, welche Art von Operationen Sie für Ihren Text ausführen möchten, und wählen Sie dann diejenige aus, die diese am besten unterstützt.
  • Da eine Variable string eine Containerklasse ist, sollten Sie beachten, wie sich ihre Größe von einer entsprechenden Zeichenfelddarstellung unterscheidet. An deinem Beispiel:

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

    Beachten Sie, dass der string-Container seine Größe als 1x1 aufführt (und mehr Bytes im Speicher beansprucht), während das Zeichenarray, wie der Name schon sagt, ein 1x2-Array von Zeichen ist.

  • Sie können nicht immer austauschbar verwendet werden, und Sie müssen möglicherweise für bestimmte Vorgänge zwischen den beiden konvertieren. Zum Beispiel können string-Objekte nicht als dynamische Feldnamen für die Strukturindizierung verwendet werden :

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

Strings haben zwar ein wenig Overhead, erhöhen sich aber immer noch um 2 Bytes pro Zeichen. Nach jeweils 8 Zeichen erhöht sich die Größe der Variablen. Die rote Linie ist y=2x+127

 string class

figur wird erstellt mit:

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