Vektorisierte Operationen auf Zellenfeldern

8

Dieser Beitrag wurde von folgenden Diskussion ausgelöst , ob Zellenarrays "normale Arrays" sind und dass die Vektorisierung für Zellenarrays nicht funktioniert.

Ich frage mich, warum die folgende Vektorisierungssyntax nicht in MATLAB implementiert ist, was dagegen spricht:

%Vor%

intern wäre es äquivalent zu

%Vor%

weil MATLAB weiß, wann zu wirken ist, folgende Arbeiten:

%Vor%

Das Zellen-Array ist ein Array von Zeigern . Wenn sowohl die linke als auch die rechte Seite auf gleiche Objekte zeigen, gibt isequal('hallo','hallo') erwartungsgemäß wahr zurück, und warum erlaubt MATLAB immer noch kein oberstes Beispiel?

Ich weiß Ich kann strmatch oder cellfun verwenden.

ZUSAMMENFASSUNG :

  • operator == was für die Vektorisierung im obigen Beispiel benötigt wird, ist eq und nicht isequal (andere Operatoren sind < das ist lt , etc.)
  • eq ist für numerische Typen eingebaut, für alle anderen Typen (wie Strings) bietet MATLAB die Freiheit, diese (und andere) Operatoren zu überladen.
  • Operator-Vektorisierung ist also gut möglich mit Zellen-Arrays vom definierten Typ (wie String), aber nicht standardmäßig für jeden Typ.
  • Funktion Vektorisierung wie myFun( myString ) oder myFun( myCellOfStrings ) , ist auch möglich, Sie müssen es nur intern in myFun implementieren. Die Funktionen sin(val) und sin(array) funktionieren auch nicht durch Hexerei, sondern weil beide Fälle intern implementiert sind.
Mikhail 27.06.2011, 21:44
quelle

4 Antworten

6

Erstens ist == nicht dasselbe wie isequal . Die Funktion, die aufgerufen wird, wenn Sie == verwenden, ist eq und der Umfang von jeder davon ist anders.

Wenn z. B. in eq(A,B) B ein Skalar ist, prüft die Funktion jedes Element von A auf Gleichheit mit B und gibt einen logischen Vektor zurück.

%Vor%

Allerdings prüft isequal(A,B) , ob A identisch in allen Aspekten gleich B ist. Mit anderen Worten, MATLAB kann den Unterschied zwischen A und B nicht erkennen. Tun Sie dies für das obige Beispiel:

%Vor%

Ich denke, was Sie wirklich in der Frage stellen wollten, aber nicht taten:

  

"Warum ist == nicht für Zellen-Arrays definiert?"

Nun, ein einfacher Grund ist: Zellen waren nicht für eine solche Verwendung gedacht. Sie können leicht sehen, wie die Implementierung einer solchen Funktion für Zellen schnell kompliziert wird, wenn Sie beginnen, einzelne Fälle zu betrachten. Betrachten Sie zum Beispiel

%Vor%

Was würden Sie von der Antwort erwarten? Eine vernünftige Schätzung wäre

%Vor%

was fair ist. Aber sagen wir mal, ich stimme nicht zu. Jetzt möchte ich, dass die Gleichheitsoperation verschachtelte Zellen durchläuft und

zurückgibt %Vor%

Können Sie dieser Interpretation nicht zustimmen? Vielleicht nicht. Es ist gleichermaßen gültig, und in einigen Fällen ist das das gewünschte Verhalten.

Dies war nur ein einfaches Beispiel. Fügen Sie nun eine Mischung aus verschachtelten Zellen, verschiedenen Typen usw. innerhalb der Zelle hinzu und denken Sie darüber nach, wie Sie mit jedem dieser Eckfälle umgehen. Es wird schnell zu einem Albtraum für die Entwickler, eine solche Funktionalität zu implementieren, die von allen .

Die Lösung besteht also darin, die Funktion zu überladen und nur die spezifische Funktionalität zu implementieren, die Sie wünschen, um sie in Ihrer Anwendung zu verwenden. MATLAB bietet auch eine Möglichkeit, dies zu tun, indem Sie ein @cell -Verzeichnis erstellen und ein eq.m für die Verwendung mit Zellen so definieren, wie Sie es wollen. Ramashalanka hat dies in seiner Antwort demonstriert.

    
abcd 27.06.2011, 22:21
quelle
4

Es gibt viele Dinge, die MATLAB natürlich tun würden, die sie nicht gewählt haben. Vielleicht wollen sie nicht viele Sonderfälle berücksichtigen (siehe unten). Sie können es selbst tun, indem Sie überladen. Wenn Sie ein Verzeichnis @cell erstellen und das folgende in eine neue Funktion eq.m einfügen:

%Vor%

Dann können Sie das tun, z. B .:

%Vor%

Aber obwohl ich ein paar Fälle in meiner einfachen Funktion betrachtet habe, gibt es viele Dinge, die ich nicht in Betracht gezogen habe (das Überprüfen von Zellen ist gleich groß, das Prüfen einer Multielementzelle gegen ein Singleton usw.).

Ich habe isequal verwendet, obwohl es mit eq aufgerufen wurde (d. h. ==), da es {'hallo','matlab','world'} == 'matlab' besser handhabt, aber ich sollte wirklich mehr Fälle berücksichtigen.

(EDIT: Ich habe die Funktion etwas kürzer, aber weniger effizient gemacht)

    
Ramashalanka 27.06.2011 22:39
quelle
1

Der Grund für dieses Problem ist: Zellenarrays können verschiedene Arten von Variablen in verschiedenen Zellen speichern. Daher kann der Operator == nicht für das gesamte Array gut definiert werden. Es ist sogar möglich, dass eine Zelle eine andere Zelle enthält, was das Problem weiter verschärft.

Denken Sie an {4,'4',4.0,{4,4,4}} == '4' . Was sollte das Ergebnis sein? Jeder Typ wird auf unterschiedliche Weise ausgewertet.

    
DanielHsH 27.06.2011 21:52
quelle
1

Dies ist nicht nur für Strings möglich. Selbst das Folgende funktioniert nicht:

%Vor%

Zellenarrays sind nicht dieselben wie "normale" Arrays: Sie bieten unterschiedliche Syntax, unterschiedliche Semantik, unterschiedliche Fähigkeiten und sind anders implementiert (eine zusätzliche Ebene der Indirektion).

Überlegen Sie, ob == auf Zell-Arrays in isequal Element für Element definiert wurde. Das obige Beispiel wäre also kein Problem. Aber was ist damit?

%Vor%

Das resultierende Verhalten wäre in den meisten Fällen nicht sehr nützlich. Und was ist damit?

%Vor%

Und wie würdest du das definieren? (Ich kann mir mindestens drei verschiedene Interpretationen vorstellen.)

%Vor%

Und was ist damit?

%Vor%

Oder das?

%Vor%

Oder das?

%Vor%

Sie könnten alle Arten von Sonderfällen hinzufügen, aber das macht die Sprache weniger konsistent, komplexer und weniger vorhersehbar.

    
Oliver Charlesworth 27.06.2011 21:47
quelle

Tags und Links