WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

rechnen mit Vektoren

 

Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2012, 15:35     Titel: rechnen mit Vektoren
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem:

Gegeben ein Vektor beliebiger Länge. Dieser kann folgendermaßen aufgebaut sein:

A=[12
12
12
12
12
12
13
14
17
19
19
19
19
22
23]

Alle Werte sind fortlaufend (um 1 erhöht), wobei immer maximal 6 gleiche Werte untereinander stehen sollten (danach 6 Werte um 1 erhöht). Jetzt soll herausgefunden werden, welche Werte im Vektor fehlen. Im obigen Beispiel fehlen somit 5 mal 13, 5mal 14, 6 mal 15, 6 mal 16, 5 mal 17, 6 mal 18, 2 mal 19, 6 mal 20. 6 mal 21, 5 mal 22 und 5 mal 23.

Wie kann ich dies am besten realisieren?

Habe mir überlegt, dass es vielleicht sinnvoll wäre, den Vektor in eine 2xn Matrix zu überführen, wobei die zweite Spalte die Werte enthält, welche fehlen.

12 0
12 0
12 0
12 0
12 0
12 0
13 5
14 5
17 17 (6 + 6 + 5)
19 0
19 0
19 0
19 0
22 19 (2 + 6 + 6 + 5)
23 5

Vielen Dank im Voraus!


Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2012, 17:16     Titel:
  Antworten mit Zitat      
Habe folgenden Code aus dem Beitrag "Vektoren anpassen" entsprechend versucht anzupassen, komme jedoch absolut nicht weiter.

Code:

A       = [1 1 1 1 2 2 2 4 4 5];
B       = [];

for i = 1:length(A)-1
    if A(i) == A(i+1)
        anfang = i+1
        B(i) = 0;

        if i == length(A)-1
           B(i+1) = A(length(A));
        end
       
    elseif A(i)<A(i+1)
        ende = i
        fehlt = anfang-ende;
        B(end:(anfang-1)) = [];
       
        if i==length(A)-1
           B(i+1) = 0;
        end
    else
        B(i) = 0;
       
         if i == length(A)-1
         end
    end
end
 


Für einige hier wird mein Problem trivial erscheinen, jedoch für mich als Neuling stellt es derzeit ein unüberwindbares Problem dar.

Viele Grüße,
Clara
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2012, 17:23     Titel:
  Antworten mit Zitat      
Als Ergebnisvektor B müsste folgendes herauskommen:

A = [1 1 1 1 2 2 2 4 4 5]
B = [0 0 0 0 2 0 0 9 0 9]
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.01.2012, 17:39     Titel:
  Antworten mit Zitat      
Hallo Clara,

Siehe HISTC.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2012, 17:54     Titel:
  Antworten mit Zitat      
Wie kann mir bei meinem Problem die Histogrammfunktion helfen?
 
samsa10
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 10.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2012, 19:36     Titel:
  Antworten mit Zitat      
Hallo!

Jan hat schon alles gesagt, die von ihm vorgeschlagene Funktion ist wohl das beste hier.

Z.B.

Code:

range=12:23;
6-histc(A,range)
 


liefert an den entsprechenden Stellen die Anzahl der fehlenden Werte.

Grüße samsa
Private Nachricht senden Benutzer-Profile anzeigen
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 10:48     Titel:
  Antworten mit Zitat      
Vielen vielen Dank für Eure Hilfe.
Mit
Code:

range=min(A):max(A);
V=6-histc(A,range)
 

bekomme ich den Vektor
V=[2 3 6 4 5] ausgegeben. Jetzt hab ich jedoch das Problem, dass dieser Vektor nicht die gleiche Größe hat wie A.

Frage: Wie ist es möglich die noch fehlenden "0" an der richtigen Stelle in den Vektor einzutragen, dass als Ergebnis der Vektor
B=[0 0 0 0 2 0 0 9 0 9]
herauskommt?
 
samsa10
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 10.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 11:24     Titel:
  Antworten mit Zitat      
Hallo!

Clara hat Folgendes geschrieben:

bekomme ich den Vektor
V=[2 3 6 4 5] ausgegeben


auf welchen Vektor A bezieht sich dieses Ergebnis?

Clara hat Folgendes geschrieben:

dass als Ergebnis der Vektor B=[0 0 0 0 2 0 0 9 0 9] herauskommt?

Was soll im Vektor B genau stehen?

Der Befehl

Code:

range=min(A):max(A);
V=6-histc(A,range)
 

liefert genau das, was du in deinem ersten Post haben wolltest,- daher sehe ich noch nicht, wo das Problem liegt.

Grüße samsa
Private Nachricht senden Benutzer-Profile anzeigen
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 12:35     Titel:
  Antworten mit Zitat      
Hallo,
ich beziehe mich auf den Vektor A aus dem dritten Posting.

A = [1 1 1 1 2 2 2 4 4 5]

Mit
Code:

range=min(A):max(A);
V=6-histc(A,range)
 


bekomme ich den Vektor

V=[2 3 6 4 5]

ausgegeben, was absolut richtig ist. Jedoch habe ich nun das Problem, dass ich diese Beiden Vektoren aufgrund der unterschiedlichen Größe nicht vergleichen kann. Ich muss den Vektor V derart anpassen, dass folgendes dabei herauskommt.

B = [0 0 0 0 2 0 0 9 0 9]

Erklärung zu Vektor B:

A B
1 0 --> nichts fehlt
1 0 --> nichts fehlt
1 0 --> nichts fehlt
1 0 --> nichts fehlt
2 2 --> 2 mal die 1 fehlt
2 0 --> nichts fehlt
2 0 --> nichts fehlt
4 9 --> 3 mal die 2 und 6 mal die 3 fehlt (weil 3 gar nicht in A auftaucht, soll deren Fehlen bei der nächsten Zahl mit berücksichtigt werden
4 0 --> nichts fehlt
5 9 --> 4 mal die 4 fehlt und 5 mal die 5 fehlt
 
samsa10
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 10.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 13:18     Titel:
  Antworten mit Zitat      
Hallo!

Inwiefern musst du die beiden Vektoren vergleichen, bzw. was soll das Endresultat sein? Diese Herangehensweise scheint mir etwas umständlich zu sein, vielleicht könnte man es besser umsetzen..

Grüße samsa
Private Nachricht senden Benutzer-Profile anzeigen
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

im Prinzip können nur sieben Fälle auftreten. Wenn im Vektor V eine 0 auftaucht, schreibe in Vektor B ab dieser Stelle sechs mal die 0 hintereinander.
Wenn als nächste Zahl eine 1 im Vektor V auftaucht (somit ist klar, dass 1 Wert fehlt), zähle ab der zuvor mit 0 belegten sechsten Stelle im Vektor 5+1 Stellen hinzu und schreibe an diese die 1. Alle Stellen von der Sechsten Stelle bis zur 6+5 Stelle des Vektor B erhalten eine 0, da diese korrekt sind. usw.

Viele Grüße,
Clara
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.01.2012, 14:24     Titel:
  Antworten mit Zitat      
Hallo

meinst du so, das funktioniert nach unteren Regel,
Oben hast du nach anderem Regel vorgeführt

Code:

% mvk -> Maximales Vorkommen
mvk    = 6;
A     = [1 1 1 1 2 2 2 4 4 5] ;

% funktioniert nur für Zeilenvektor
if size(A,2)==1;
   A  = A';
end
B     = zeros(size(A));

% tvk -> tasaechliches Vorkommen
[tvk]  = histc(A,min(A):max(A));
tvk    = mvk-tvk;

% finde Wechselpostionen
sp     = find([0 diff(A)]~=0);

pos    = find(ismember(min(A):max(A),A(sp)));
% Start Position
spos      =  pos-diff([1 pos]);
% End Posionen
epos       = pos-1;
% letzte Postion zaehlt mit sich
epos(end)  = max(pos);
% bilde Summen von s bis e und schreibe an Wechselpositionen
B(sp) = arrayfun(@(s,e)sum(tvk(s:e)),spos,epos);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 14:33     Titel:
  Antworten mit Zitat      
VIELEN DANK! Genau das suchte ich!!
 
Clara

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 14:42     Titel:
  Antworten mit Zitat      
Wenn A ein Spaltenvektor wäre, inwieweit muss der obige Code angepasst werden?

Viele Grüße,
Clara
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.01.2012, 14:55     Titel:
  Antworten mit Zitat      
so funktioniert das für beide für Zeilen und Spalten Vektoren

Code:

% mvk -> Maximales Vorkommen
mvk    = 6;
A     = [1 1 1 1 2 2 2 4 4 5] ;
B     = zeros(size(A));

% tvk -> tasaechliches Vorkommen
[tvk]  = histc(A,min(A):max(A));
tvk    = mvk-tvk;

% finde Wechselpostionen
if size(A,2)==1
   sp     = find([0; diff(A)]~=0);
else
   sp     = find([0 diff(A)]~=0);
end
pos    = find(ismember(min(A):max(A),A(sp)));
% Start Position
spos      =  pos-diff([1 pos]);
% End Posionen
epos       = pos-1;
% letzte Postion zaehlt mit sich
epos(end)  = max(pos);
% bilde Summen von s bis e und schreibe an Wechselpositionen
B(sp) = arrayfun(@(s,e)sum(tvk(s:e)),spos,epos)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.