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

Matrix um leere Spalte erweitern und diese mit Schleife fül

 

Nemo2002
Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2013, 15:36     Titel: Matrix um leere Spalte erweitern und diese mit Schleife fül
  Antworten mit Zitat      
Hey Leute,

ich hätte nochmal eine Frage wo ich nicht weiterkomme....vll kann mir ja wer helfen.

Folgendes Problem:

Ich habe eine Matrix mit 9 Spalten (Zeilen hängen je nach Datensatz ab, z.b. 49000x9 dataset). Die Matrix heißt "ds"

Jetzt würd ich gern eine neue Spalte hinzufügen, mit dem Namen "vote". Diese Spalte soll dann aber durch eine Schleife gefüllt werden.
Ich würde gern, dass MATLAB anhand einer anderen Spalte der Matrix die neue Spalte füllt.
Hier ein Beispiel: MATLAB soll sich in der Matrix die Spalte "source" angucken und je nach dem dort vorhandenen Wert die Spalte "vote" füllen.
Z.b. wenn "source" 1 ist, dann schreib in "vote" auch 1 und wenn "source" 2 ist, dann schreib in "vote" 0.

Das wollte ich anhand einer if/else schleife machen.

Code:
if ds.source = 1 %so kann ich doch die Spalte in der Matrix speziell ansteuern, oder?
            ds.vote = 1
         elseif ds.source =2
               ds.vote = 0
           end


Das wollte ich dann für insgesamt 9 Werte machen, also "source" kann zwischen 1 und 9 liegen und deswegen würd ich für jedes Argument ne elseif-Schleife machen....

Nur, wie kann ich das sinnvoll zusammenfügen? Bin da grad etwas aufgeschmissen und versteh den Trick dabei nicht ganz...ich bin mir sicher, dass es ziemlich einfach ist, aber ich komm einfach nicht drauf....

Über Hilfe wäre ich sehr dankbar Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.11.2013, 16:01     Titel:
  Antworten mit Zitat      
Hallo,

Testen auf Gleichheit musst du mit == machen.
ds.source steuert zwar die ganze Spalte an, aber eine if-Abfrage würde hier testen, ob die gesamte Spalte 1 ist.

Ich würde es so machen:
Code:
ds.vote = zeros(size(ds.source));
ds.vote(ds.source == 1) = 2;
...


Sollte es eine Arithmetik geben, über die sich vote aus source ergibt, wäre das natürlich einfacher.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2013, 21:30     Titel:
  Antworten mit Zitat      
danke für den Tipp harald, hab es mal getestet und funktioniert super!



naja, ne Arithmetik soll es im Endeffekt schon sein....erinnerst dich ja sicher noch an meine andere frage, dort waren ja votes, views und comments gegeben.

Ich habe jetzt durch das einlesen der DAten gruppen anhand von source gebildet (1-9) und dan nauch den Mittelwert der GRuppen für votes, views und comments...jetzt will ich in dem 2. datensatz die mittelwerte einfügen, also wenn source=1 soll der vorher gespeicherte mittelwert in allen zeilen eingefügt werden.

Das ist mein Ziel, wollte es jedoch erstmal in Etappen machen und für jede Spalte eineln...oder gibt es da vll einen Trick der das sofort für 3 Spalten allgemein macht aus einer Quelle?

Ich habs jetzt mal sehr umständlich gemacht.....
Die jeweiligen Werte die dort eingetragen werden hab ich aus einem 1x3 double

Code:
ds_test.votes = zeros(size(ds_test.source_double)); %Füge Spalte "votes" hinzu
ds_test.votes(ds_test.source_double == 1) = 3;
ds_test.votes(ds_test.source_double == 2) = 3;
ds_test.votes(ds_test.source_double == 3) = 2;
ds_test.votes(ds_test.source_double == 4) = 2;
ds_test.votes(ds_test.source_double == 5) = 2;
ds_test.votes(ds_test.source_double == 6) = 2;
ds_test.votes(ds_test.source_double == 7) = 3;
ds_test.votes(ds_test.source_double == 8) = 1;
ds_test.votes(ds_test.source_double == 9) = 2;

ds_test.comments = zeros(size(ds_test.source_double)); %Füge Spalte "comments" hinzu
ds_test.comments(ds_test.source_double == 1) = 0;
ds_test.comments(ds_test.source_double == 2) = 0;
ds_test.comments(ds_test.source_double == 3) = 0;
ds_test.comments(ds_test.source_double == 4) = 0;
ds_test.comments(ds_test.source_double == 5) = 0;
ds_test.comments(ds_test.source_double == 6) = 0;
ds_test.comments(ds_test.source_double == 7) = 0;
ds_test.comments(ds_test.source_double == 8) = 0;
ds_test.comments(ds_test.source_double == 9) = 0;

ds_test.views = zeros(size(ds_test.source_double)); %Füge Spalte "views" hinzu
ds_test.views(ds_test.source_double == 1) = 48;
ds_test.views(ds_test.source_double == 2) = 22;
ds_test.views(ds_test.source_double == 3) = 15;
ds_test.views(ds_test.source_double == 4) = 19;
ds_test.views(ds_test.source_double == 5) = 17;
ds_test.views(ds_test.source_double == 6) = 4;
ds_test.views(ds_test.source_double == 7) = 20;
ds_test.views(ds_test.source_double == 8) = 0;
ds_test.views(ds_test.source_double == 9) = 6;


Den Median berechne ich so:
Code:
median_android = datasetfun(@median, android_ds, 'DataVars', {'num_votes', 'num_comments', 'num_views'});
disp(median_android);


Als beispiel ist steht z.b. ds_test.source_double == 1 für "median_android"....kann ich es irgendwie programmieren, dass er mir automatisch die 3 Werte auf der Datei zieht? Dort sind die Werte ja bereits in 3 Spalten und naja, es würd mein Programm sehr vereinfach, vorallem wenn sich median_andriod ändert...so muss ich ja alles per hand eintragen^^
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2013, 11:57     Titel:
  Antworten mit Zitat      
Hallo,

mir ist eine Idee gekommen, wie das eleganter gehen sollte:
Code:
vote_values = [3; 3; 2; 2; 2; 2; 3; 1; 2];
ds.vote = vote_values(ds.source_double);


Bei Comments brauchst du nichts zu überschreiben, der Vektor ist ja schon mit Nullen initialisiert.

Bei views kannst du denselben Trick anwenden wie bei vote.

Beim letzten Teil verstehe ich die Frage nicht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2013, 12:10     Titel:
  Antworten mit Zitat      
danke, so ist es deutlich einfacher und übersichtlicher....

Dann versuch ich es mal genauer zu erklären.....median_android gibt mir die Werte für votes, comments udn views...bisher änder ich die ja manuell in der Eingabe, ist es denn möglich ,dass MATLAB sich diese Werte direkt aus median_Android zieht? Das ist ein 1x3 double.....

Dort steht dann z.b. 2 0 4 drin, also 2 votes, 0 comments und 4 views.....

nehmen wir also an ds.source_double == 1 bezieht sich auf die Werte aus median_android.

Bislang würd ich es ja so machen:

Code:

ds_test.votes = zeros(size(ds_test.source_double));
ds_test.votes(ds_test.source_double == 1) = 2;

ds_test.comments = zeros(size(ds_test.source_double));
ds_test.comments(ds_test.source_double == 1) = 0;

ds_test.views = zeros(size(ds_test.source_double));
ds_test.views(ds_test.source_double == 1) = 4;
 


ich trage also die Werte 2, 0 und 4 manuell aus median_android raus, kann ich das irgendwie automatisieren, dass MATLAB sich die wertte jeweils aus median_android direkt zieht?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2013, 12:26     Titel:
  Antworten mit Zitat      
Hallo,

du kannst das oben beschriebene anwenden.

Erstelle dir eine Matrix mit 3 Spalten und Zeilen für 1-9 (die erste Zeile wäre also dann das median_android), und dann sollte das Befüllen wie dargestelllt klappen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2013, 12:47     Titel:
  Antworten mit Zitat      
okay, da hab ich jetzt eine Matrix 9x3 double mit den ganzen verschiedenen möglichkeiten untereinander

aber wie kann ich denn jetzt die matrix mit meiner anderen kombinieren?

ich müsste ja 3 Spalten je Zeile auf einmal ansteuern, dass er die übernimmt....

bzw. um es zu verstehen, meine matrix heißt medi.mat
hab sie erstmal mit load medi.mat geladen.....

Meine 1. Idee war:

Code:
votes_values = [medi.1; medi.2; medi.3; medi.4; medi.5; medi.6; medi.7; medi.8; medi.9];


Dies ist aber blödsinn, da ich ja 9 Spalten ansteuer, ich aber nur die 1. haben will, also müsste ja überall medi.1 stehen und dann die jeweiligen Zeilen von 1-9....irgendwie happert es da noch...kansnt du mir da vll noch einen Tipp geben?

2. Idee: ich kann ja mit 2.3 die 2. Zeile und 3. Spalte ansteuern....also müsste ja folgendes gehen:

Code:
votes_values = [1.1; 2.1; 3.1; 4.1; 5.1; 6.1; 7.1; 8.1; 9.1]


nur wie füge ich hinzu, dass er sich dabei auf medi.mat beziehen soll?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2013, 18:52     Titel:
  Antworten mit Zitat      
Hallo,

was du schreibst, ist für mich ein Rätsel.
medi.1 etc. ist keine gültige MATLAB-Syntax. Ich weiß also nicht, was das sein soll.

Zitat:
ich kann ja mit 2.3 die 2. Zeile und 3. Spalte ansteuern.

Nein, dazu müsstest du Zeilen-Spaltenindizierung verwenden:
matrix(2,3)

Wenn du eine .mat-Datei lädst, werden die darin enthaltenen Variablen in den Workspace geladen. Variable und Datei können gleich heißen, das ist aber eher die Ausnahme - daher sollte man da genau unterscheiden.

Mein Vorschlag war so gedacht:
Code:
ds.vote = matrix(ds.source_double,1);
ds.comments = matrix(ds.source_double,2);
ds.views = matrix(ds.source_double,3);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2013, 19:30     Titel:
  Antworten mit Zitat      
hey Harald, danke für deine Antwort, aber irgendwie versteh ich deine Vorgehensweise nicht, stehe da auf dem Schlauch.

Ich mache meine 9x3 Matrix so:

Code:
medi = [median_map_widget; median_mobile_site; median_na; median_map_widget; median_android; median_city_initiated; median_iphone; median_remote_api_created; median_web];
 


(deswegen auch der Name medi eben)

Und daraus möchte ich jeweils die Werte ansteuern, wenn jetzt also die 1. Spalte 3; 3; 2; 2; 2; 2; 3; 1; 2 ist, also so wie bereits oben von dir vorgeschlagen

Code:
votes_values = [3; 3; 2; 2; 2; 2; 3; 1; 2];
ds_test.votes = votes_values(ds_test.source_double);


nur will ich jetzt eben erreichen, dass mir votes_values direkt auf die Matrix zugreift, also die 1. Spalte mit den jeweiligen Zeilen.....damit ich die Änderungen nicht immer händisch machen muss.

Deine Matrix bezieht sich ja auf die Spalte mit der ich vergleichen will und nicht auf meine median-Werte oder seh ich das falsch?

Tut mir sehr leid, wenn ich mich so "dämmlich" anstell....
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2013, 19:47     Titel:
  Antworten mit Zitat      
Hallo,

hast du den Vorschlag denn mal ausprobiert?
Meines Erachtens sollte er das machen, was du möchtest. Denn ob du die Werte direkt hinschreibst oder als Spalte aus einer Matrix ziehst, sollte egal sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2013, 20:01     Titel:
  Antworten mit Zitat      
oh gott, das ist mir jetzt peinlich

Ich Idiot hab das einfach so von dir kopiert, mit dem Matrix und das gab bei mir einen Fehler.....jetzt, als ich das aber in den namen meienr matrix umgeändert hätte funktioniert es perfekt


vielen dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2013, 20:17     Titel:
  Antworten mit Zitat      
Hallo,

bei Fehlern bitte immer den Fehler angeben. Dann kann man ggf. auch da weiterhelfen :)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2013, 21:23     Titel:
  Antworten mit Zitat      
okay, werd ich machen...eine Frage hab ich noch,

ich will jetzt 4 Spalten in csv exportieren.

id, votes, comments und views

Das funktioniert auch alles, nur er gibt mir die 6-stelligen Zahlen der id nicht richtig wieder, bei den 5 stelligen funktioniert es:

21523
87152
182789
312571
246776
86278


21523
87152
1.8279e+05
3.1257e+05
2.4678e+05
86278

Weißt du vll woran das liegt?
Ich hab es so programmiert:

Code:
ds_test.vote = medi(ds_test.source_double,1);
ds_test.comments = medi(ds_test.source_double,2);
ds_test.views = medi(ds_test.source_double,3);

save ds_test

solution = [ds_test.id ds_test.vote ds_test.comments ds_test.views];

save solution

csvwrite('solution.csv',solution);
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.11.2013, 23:20     Titel:
  Antworten mit Zitat      
Hallo,

das ist schon richtig, nur das Format ist eben nicht so, wie du's dir vorstellst.

Versuchs mal mit dlmwrite und dem 'precision'-Argument.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2013, 00:17     Titel:
  Antworten mit Zitat      
danke ,das hab ich jetzt gelöst


und gleich direkt wieder ein neues problem...ich will überschriften mit reinbringen in die csv-datei, hab folgenden code:

Code:
headers = {'id' 'num_views' 'num_votes' 'num_comments'};
solution = [ds_test.id ds_test.vote ds_test.comments ds_test.views];


save solution

dlmwrite('solution2.csv',headers,solution,'precision',6,'delimiter',' ');



Error using dlmwrite (line 118)
In 'MATLAB:dlmwrite:Attribute', parameter {1} must be a scalar.

Error in insert_medians_EINFACH (line 21)
dlmwrite('solution2.csv',headers,solution,'precision',6,'delimiter',' ');

Der Fehler ist, dass Headers eine 1x4 cell ist während solution eine 149751x4 double.

Wie kann ich die auf das selbe Format bringen? Hab mit cell2mat probiert aber das geht nicht...kansnt du mir vll noch einmal helfen?

Oder kann ich irgendwie die headers aus dem ds_test dataset mit rausziehn? bisher nimmt er nämlich nur die spalten, ohne headers.....
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.