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

unique verwende

 

djanski
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2011, 21:31     Titel: unique verwende
  Antworten mit Zitat      
Guten Abend zusammen,

also ich habe ein kleines Problem welches mir einfach den letzten Nerv raubt. Ich weiß beim besten willen nciht mehr weiter. Sad

Also ich lasse mir innerhalb ein 3-fach verschachtelten for-Schleife ein array füllen. Das sieht ungefähr so aus.

Code:

for i = 1:length(schnitt)
     for ii = 1:length(vorschub)
           for iii = 1:length(zustellung)

normalkraft(f,1) = koef1*schnitt(i) + koef2*vorschub(ii) + koef3*zustellung(iii);
normalkraft(f,2) = schnitt(i);
normalkraft(f,3) = vorschub(ii);
normalkraft(f,4) = zustellung(iii);
f= f+1
end
end
end
 


Im Anschluss möchte ich kontrollieren ob in der ersten Spalte Werte doppelt sind und diese rausschmeisen. Das habe ich mit unique gemacht. Da ich aber auch die Werte der anderen Spalten brauche habe ich mir dann das Array entsprechend der sich aus unique ergebenden sortierung umsortiert und überschüssige Werte abgeschnitten.

Code:

f = 1

[a1 b1] = unique(normalkraft(:,1));
for i = 1:length(b1)
    normalkraft(f,:) = normalkraft(b1(i),:);
    f= f+1;
end
normalkraft(f+1:end,:) = []; %Werte abschneiden
 


Soweit so gut. Das Ergebnis sieht also so aus, dass die erste Spalte der Größe nach sortiert ist und alle anderen Spalten gleichgezogen haben.

Beipspiel:
Aus
5 1 2 3
4 2 3 6
6 5 6 4

wurde
4 2 3 6
5 1 2 3
6 5 6 4

Das Array enthält natürlich viel mehr Zeilen...

Im anschluss will ich aber keine sortierung haben von klein zu groß, sondern von groß zu klein.

losen wollte ich das mit sortrows.

Code:

normalkraft_sortiert = sortrows(normalkraft,-1)
 


Und jetzt passiert das was ich mir nicht erklären kann. Aus irgendeinem Grund dupliziert er Reihen und das Ergebnis sieht so aus.

6 5 6 4
5 1 2 3
5 1 2 3
4 2 3 6

Grundsätzlich zwar richtig sortiert aber mit doppelt vorkommenden Zeilen.
Noch viel spannender finde ich dass, wenn ich auf das bereits mit unique sortierte und zurechtgeschnittene array noch mal sortrows anwende erwarte ich das sich absolut nichts tut da ja die erste Zeile bereits der Größe nach sortiert ist. Doch auch hier werden Zeilen dupliziert.

Kann mir das wer erklären? Ich verstehs einfach nicht.
Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 23:24     Titel:
  Antworten mit Zitat      
Ich verstehe es auch nicht...bei mir kommt das gewünschte Ergebnis. Es wird nach der ersten Reihe absteigend sortiert

Code:
M=[4 2 3 6;5 1 2 3;6 5 6 4]

M =

     4     2     3     6
     5     1     2     3
     6     5     6     4

>> sortrows(M,-1)

ans =

     6     5     6     4
     5     1     2     3
     4     2     3     6


Sortieren der Spalten absteigend

Code:
sort(M,'descend')

ans =

     6     5     6     6
     5     2     3     4
     4     1     2     3
 


Sortieren der Reihen...

Code:
sort(M,2,'descend')

ans =

     6     4     3     2
     5     3     2     1
     6     6     5     4
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2011, 12:03     Titel:
  Antworten mit Zitat      
Also ich habe jetzt noch mal ein wenig rumprobiert und zum besseren Verständnis die folgenden 2 Codes geschrieben:

Code 1:
Code:

clear all
clc

Schnittgeschw = 30:0.1:50;
Vorschub = 4:0.1:6;
Zustellung = 4:0.1:9;

anzahl = length(Schnittgeschw)*length(Vorschub)*length(Zustellung);
normalkraft = zeros(anzahl,4);


f = 1;
%3.97081
for i = 1:length(Schnittgeschw)
    for ii = 1:length(Vorschub)
        for iii = 1:length(Zustellung)
            normalkraft(f,1) = 0*Schnittgeschw(i) + 12.0114*Vorschub(ii) + 30.8964*Zustellung(iii);
            normalkraft(f,2) = Schnittgeschw(i);
            normalkraft(f,3) = Vorschub(ii);
            normalkraft(f,4) = Zustellung(iii);
            f = f+1;
        end
    end
end

erebnis_1 = normalkraft(1:10,:)
groesse_1 = size(normalkraft)


%% Sortierung mit dem Befel unique
normalkraft_sortiert = zeros(anzahl,4);

g = 1;
[a1 b1] = unique(normalkraft(:,1));  %Zugriff auf die erste Spalte und suche nach doppelten Einträgen. Gleichzeitig wird der Größe nach sortiert
for i = 1:length(b1)                 %Zugriff auf die in b1 enthaltenen Indize um die Spalten 2-4 der Sortierung der in a1 enthaltenen Werte anzupassen
    normalkraft_sortiert(g,:) = normalkraft(b1(i),:);
    g = g+1;
end
normalkraft_sortiert(g+1:end,:) = []; %Sollten werte doppelt gewesen sein würde hiermit die die überschüssigen Zeilen abgeschnitten werden

ergebnis_2 = normalkraft_sortiert(1:10,:)
groesse_2 = size(normalkraft_sortiert)

% Auf das Ergebnis noch mal sortrows anwenden (Das Ergebnis sollte das
% gleiche wie bei ergebnis_2 sein
normalkraft_sortiert_1 = sortrows(normalkraft_sortiert);

ergebnis_3 = normalkraft_sortiert_1(1:10,:)
groesse_3 = size(normalkraft_sortiert_1)

% % Auf das Ergebnis noch mal sortrows anwenden (absteigende sortierung)
normalkraft_sortiert_2 = sortrows(normalkraft_sortiert,-1);

ergebnis_4 = normalkraft_sortiert_2(1:20,:)
groesse_4 = size(normalkraft_sortiert_2)
 


Code 2:
Code:

clear all
clc

Schnittgeschw = 30:0.1:50;
Vorschub = 4:0.1:6;
Zustellung = 4:0.1:9;

anzahl = length(Schnittgeschw)*length(Vorschub)*length(Zustellung);
normalkraft = zeros(anzahl,4);


f = 1;
%3.97081
for i = 1:length(Schnittgeschw)
    for ii = 1:length(Vorschub)
        for iii = 1:length(Zustellung)
            normalkraft(f,1) = 3.97081*Schnittgeschw(i) + 12.0114*Vorschub(ii) + 30.8964*Zustellung(iii);
            normalkraft(f,2) = Schnittgeschw(i);
            normalkraft(f,3) = Vorschub(ii);
            normalkraft(f,4) = Zustellung(iii);
            f = f+1;
        end
    end
end

erebnis_1 = normalkraft(1:10,:)
groesse_1 = size(normalkraft)


%% Sortierung mit dem Befel unique
% normalkraft_sortiert = zeros(anzahl,4);

g = 1;
[a1 b1] = unique(normalkraft(:,1));  %Zugriff auf die erste Spalte und suche nach doppelten Einträgen. Gleichzeitig wird der Größe nach sortiert
for i = 1:length(b1)                 %Zugriff auf die in b1 enthaltenen Indize um die Spalten 2-4 der Sortierung der in a1 enthaltenen Werte anzupassen
    normalkraft(g,:) = normalkraft(b1(i),:);
    g = g+1;
end
normalkraft(g+1:end,:) = []; %Sollten werte doppelt gewesen sein würde hiermit die die überschüssigen Zeilen abgeschnitten werden

ergebnis_2 = normalkraft(1:10,:)
groesse_2 = size(normalkraft)

% Auf das Ergebnis noch mal sortrows anwenden (Das Ergebnis sollte das
% gleiche wie bei ergebnis_2 sein
normalkraft_sortiert_1 = sortrows(normalkraft);

ergebnis_3 = normalkraft_sortiert_1(1:10,:)
groesse_3 = size(normalkraft_sortiert_1)

% % Auf das Ergebnis noch mal sortrows anwenden (absteigende sortierung)
normalkraft_sortiert_2 = sortrows(normalkraft,-1);

ergebnis_4 = normalkraft_sortiert_2(1:20,:)
groesse_4 = size(normalkraft_sortiert_2)
 


Der Unterschied zwischen Code 1 und 2 besteht darin, dass ich in Code 1 bei der Anwendung von unique eine neue Variable deklariert habe während ich in Code 2 die gleiche einfach noch mal verwendet habe.

Code 1: normalkraft wird zu normalkraft_sortiert
Code 2: normalkraft wird weiter verwendet

Wenn ihr jeweils die Variable "ergebnis_3" mit einander vergleicht erkennt ihr was ich meine mit doppelten Einträgen.
Bedeutet also, ich könnte das Problem lösen, indem ich einfach jeweils eine neue Variable verwende für den Eintrag bei unique. Da das Skript aber ein bißchen länger ist würde das bedeuten, dass ich 120 neue Variablen deklarieren müsste und an einer anderen Stelle im Skript den jeweiligen Zugriff für sortrows ädern müsste.

Ich würde gerne erst mal verstehen wie es zu diesem Fehler kommen kann und ob ich ihn anderweitig umgehen kann bevor ich mir diesen Aufwand mache.

Ich würde mcih freun, wenn sich jemand die beiden Codes mal anschauen könnte.

LG
djanski

PS:
Bei dem so gewähltem Beispiel kann es natürlich keine doppelten Einträge geben womit eine Sortierung über sortrows völlig ausreichend wäre. Allerdings gibt es Variablen für deren Berechnung einer der Koeffizienten 0 ist, das Ergebnis der Berechnung also von eienr Größe unabhängig ist und inder Folge auch dopplte Einträge auftauchen. Um für diesen Fall nicht extra ein neues Skript schreiben zu müssen wäre es schön wenn es auf diesem Wege hinzubekommen ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2011, 17:39     Titel:
  Antworten mit Zitat      
Habe das Problem jetzt selber erkannt. Manchmal hilft es einfach das Skript einen Tag lag nicht anzusehen Wink.

Trotzdem danke für die Antwort DSP.
Private Nachricht senden Benutzer-Profile anzeigen
 
Eisbär

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2011, 21:57     Titel: Re: unique verwende
  Antworten mit Zitat      
Code:

Schnittgeschw = 30:0.1:50;
Vorschub = 4:0.1:6;
Zustellung = 4:0.1:9;
coeff=[0,12,30];
[s,v,z]=ndgrid(Schnittg,Vorsch,Zust];  % baut dir die Kombinationen zusammen).
% und jetzt Matlab in seiner ganzen Schönheit:
normalkraft=[coef*[s(:);v(:);z(:)];[s(:);v(:);z(:)]];
 
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2011, 00:14     Titel:
  Antworten mit Zitat      
Ok, Matlab kann echt krank sein Smile

Könntest du mir noch kurz erklären was genau in deiner letzten Zeile passiert?
Code:

normalkraft=[coef*[s(:);v(:);z(:)];[s(:);v(:);z(:)]];
 

Verstehe ich das richtig, dass Matlab im ersten Teil dieser Zeile die jeweiligen Koeffizienten auf die jeweilige Kombination von Schnittgeschw, Vorschub und Zustellung anwendet und der zweite Teil dazu dient die Spalten 2-4 mit der für die Berechnugn verwendeten Schnittgeschw, Vorschub und Zustellung zu füllen?

Ist es dann noch nötig die Variable "normalkraft" vorzudefinieren um die Laufzeit zu minimieren oder ergibt sich das mit dem Befehl ndgrid?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.