2016-12-30 4 views
1

Lassen Sie sich sagen, dass ich ein Array in MATLAB Temp mit genannt:Funktion auf Abschnitte des Arrays anwenden?

40.2000 
    40.2000 
    40.2000 
    39.2000 
    39.2000 
    39.2000 
    38.5000 
    38.5000 
    38.5000 
    38.5000 
    38.5000 
    39.4000 
    42.7000 
    42.7000 
    42.7000 
    42.7000 
    42.7000 
    44.1000 
    44.1000 
    44.1000 

würde Ich mag zu einem Zeitpunkt nur auf Abschnitte dieses Array eine Funktion anzuwenden, die die gleichen Werte haben, so gilt Funktion Elemente 1: 3, dann wenden Sie es auf 4: 6, etc ...

Was ist der einfachste Weg für mich, dies zu tun?

+1

Es ist wichtig zu wissen, was die spezifische Funktion . Zusätzlich zu Suevers großartiger Antwort kann ein schnellerer Ansatz möglich sein, je nachdem, was Sie mit jeder Gruppe gleicher Werte machen möchten. Außerdem sollten Sie angeben, was mit Daten geschieht, zum Beispiel "[3 3 2 2 2 3 3 4 4]". Sollten Werte "3" eine oder zwei Gruppen bilden? –

+0

Ja, Sie haben Recht. Der allgemeine Funktionsansatz, den Suever lieferte, war jedoch das, wonach ich suchte. Danke für Ihre Bemühungen! :) –

Antwort

3

Sie können accumarray verwenden, um eine Operation für die Gruppen eindeutiger Werte durchzuführen. Zuerst können wir unique verwenden, um die Gruppierung für uns in eindeutige Werte durchzuführen, und das Ergebnis ist ein Array von Indizes mit der Größe Ihrer Eingabe, wobei jedes Element einen Index enthält, der angibt, welcher eindeutigen Gruppe es angehört. Wir können dies dann an accumarray übergeben, die ein Array von Werten akzeptiert und die gewünschte Option für dieses Array ausführt. Im folgenden Beispiel gehe ich davon aus, dass Sie eine Funktion namens your_operation.m haben, die ein Array als Eingabe verwendet und einen Skalar liefert.

[~, ~, b] = unique(data, 'stable'); 

% Now perform your operation on each group 
results = accumarray(b, data, [], @(x)your_operation(x)); 

Wenn Sie ein Array von Ihrer Funktion zurückgeben müssen möchten Sie den Anruf zu your_operation in {} wickeln es ein Zellenfeld zu machen

results = accumarray(b, data, [], @(x){your_operation(x)}); 
+0

Hallo. Vielen Dank für die ausführliche Antwort! Es war sehr hilfreich und was ich suchte :) Frohes neues Jahr. –

Verwandte Themen