Matlab: Konvertieren eines Doppelvektor-Arrays in ein String-Zellen-Array

8
%Vor%

Jetzt mache ich eine Reihe von Operationen auf dem Keyset, die zurück geben

%Vor%

Ich habe das folgende müde:

%Vor%

All das gab im letzten Zellenfeld seltsame Ergebnisse. Ich brauche nur die Ganzzahlen, die als Schlüssel für eine andere Container-Map verwendet werden.

    
martin 30.12.2012, 11:38
quelle

4 Antworten

13

Ich schlage 5 zusätzliche Lösungen vor, von denen drei 4-5x schneller sind als die bisher vorgeschlagenen Lösungen. Die Lehren daraus sind:

  • num2str ist langsam
  • cellfun und arrayfun können erheblichen Overhead hinzufügen
  • Es gibt viele Möglichkeiten, ein numerisches Array in ein Zellen-Array von Strings umzuwandeln.

Die drei leistungsstärksten Lösungen sind in Bezug auf die Leistung sehr ähnlich:

Looping zum Zuweisen von Zellenelementen

%Vor%

Konvertiert alles in eine Zeichenkette und ruft textscan

auf %Vor%

Konvertiert alles in string und ruft regexp auf.

%Vor%

Hier ist der vollständige Testcode mit Timings:

%Vor%     
Jonas 31.12.2012, 00:13
quelle
7

Wie wäre es mit:

%Vor%

, das ein 4-mal-1-Zellen-Array für Ihr Beispiel ergeben sollte:

%Vor%     
Eitan T 30.12.2012 12:06
quelle
3

Wie wäre es mit:

%Vor%

Ich bin mir nicht sicher, ob dies der eleganteste Weg ist, um die gewünschten Ergebnisse zu erzielen, aber es scheint zu funktionieren ...

Laufzeit mit Eitans Lösung vergleichen:

%Vor%

Erträge:

%Vor%

Es scheint, als wäre die vorgeschlagene Lösung schneller.

Hinweis: Die aktuelle Implementierung von cellfun scheint nicht auf Geschwindigkeit optimiert zu sein. Es wird gemunkelt, dass Mathworks in zukünftigen Versionen eine bessere Implementierung von cellfun einführen möchte. Daher ist Eitans Lösung in der aktuellen Version möglicherweise nicht optimal, aber es scheint eine gute Übung für Matlab-Fähigkeiten zu sein.

    
Shai 30.12.2012 11:53
quelle
0

Es wurde herausgefunden, wie die Regexp-Lösung für große Ganzzahlen mithilfe der Split-Funktionalität verbessert werden kann. Auch wurde ich durch eine von Jonas 'Lösungen, die nicht alle Sprintf-Aufrufe in der for-Schleife ausgewertet hat, etwas in die Irre geführt. Edit: fügte auch die neue String-Funktionalität für 2016 hinzu, die in den Kommentaren vorgeschlagen wird.

%Vor%

Die Regexp-Lösung mit Split ergibt eine etwas bessere Performance und die String-Methode ist noch schneller:

%Vor%     
Matthijs Cox 30.11.2017 12:42
quelle

Tags und Links