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

Spalten miteinander vergleichen und zusammenfügen

 

derbeshot89
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 18.06.2013, 09:13     Titel: Spalten miteinander vergleichen und zusammenfügen
  Antworten mit Zitat      
Guten Tag goMATLAB-Community,

ich sitze seit zwei Tagen an einem Problem, komme aber leider nicht voran. Sad

Ich habe jeweils zwei Spalten (eine Spalte besteht aus Strings, die andere, dazugehörige Spalte aus Zahlen) aus verschiedenen Tabellen, die miteinander verglichen werden sollen. Am besten erkläre ich das Problem an einem vereinfachten Beispiel:

Zwei Spalten aus TABELLE A:

1. Spalte:
Auto
Laptop
Fernseher

2. Spalte Anzahl:
\begin{pmatrix} 1 \\ 3 \\ 2 \end{pmatrix}

Zwei Spalten aus TABELLE B:

1. Spalte:
Auto
Fahrrad
Fernseher

2. Spalte Anzahl:
\begin{pmatrix} 2 \\ 5 \\ 1 \end{pmatrix}

Ich möchte nun jeweils beide Spalten miteinander vergleichen und zusammenfügen, sodass am Ende nur noch eine Spalte mit den Artikelnamen und eine Spalte mit der Anzahl da steht. In diesem Beispiel wäre das so:

Zusammengefügt:

1. Spalte:
Auto
Laptop
Fernseher
Fahrrad

2. Spalte Anzahl:
\begin{pmatrix} 3\\ 3 \\ 3 \\ 5 \end{pmatrix}

Das Problem ist, dass ich irgendwie die beiden ersten Spalten mit den Artikelnamen vergleichen muss und sobald dasselbe drinsteht (z.B. Auto) müssen die dazugehörigen Werte (Anzahl) addiert werden, ansonsten, falls ein neuer Artikel auftaucht (hier Fahrrad), soll es in der neue Spalte als neue Zeile erscheinen. Ich hoffe, dass ich das Problem erklären konnte. Smile

Mit freundlichen Grüßen
Fatih
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.06.2013, 13:25     Titel: Re: Spalten miteinander vergleichen und zusammenfügen
  Antworten mit Zitat      
Hallo derbeshot89,

Zitat:
Ich habe jeweils zwei Spalten (eine Spalte besteht aus Strings, die andere, dazugehörige Spalte aus Zahlen) aus verschiedenen Tabellen, ...

Und hier kann ich Dir bereits nicht mehr folgen. Was sind denn genau "Spalten" und "Tabellen"? Wenn Du den entsprechenden Matlab-Code postest, wird dies auf Anhieb klar. Wenn wir erraten, was dies sein könnte (vielleicht die Spalten eines Cell-Array, oder zwei Cell Arrays, oder vielleicht sprichst Du auch von Excel-Files), liegen wir vielleicht vollkommen daneben und eine Antwort verwirrt Dich zusätzlich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 18.06.2013, 15:41     Titel:
  Antworten mit Zitat      
Hallo Jan,

es handelt sich um eine GUI, die sehr aufwendig ist, deshalb wollte ich mein Problem eher sehr einfach darstellen. Kann gut sein, dass ich das mit den Tabellen und Spalten etwas unverständlich erklärt habe.

Hier ein Beispiel was ich mir vorstelle:

Code:

%% Testen, wie man tabellen zusammenführen kann

Spalte_Artikel_one = [{'Auto'};{'Laptop'};{'Fernseher'}];
Spalte_Artikel_Anzahl_one = [1; 5 ; 3];

Spalte_Artikel_two = [{'Auto'};{'Fahrrad'};{'Laptop'}];
Spalte_Artikel_Anzahl_two = [2; 6 ; 2];


[row,col]=size(Spalte_Artikel_one);                                        
barh(Spalte_Artikel_Anzahl_one);                                  
set(gca, 'YTickLabel', Spalte_Artikel_one,'YTick',1:row);
                   
 


Ich habe ein Bild (siehe Bild: Test) beigefügt, damit du sehen kannst, was das Ergebnis ist.

Ich habe mal das, was ich herausbekommen will, manuell erstellt (síehe Bild: test2). Z.B. Auto kommt in beiden Spalten vor, deshalb wird die Anzahl von Auto addiert usw.:
Code:

Spalte_Artikel_zusammengefuegt =[{'Auto'};{'Laptop'};{'Fernseher'};{'Fahrrad'}];
Spalte_Artikel_Anzahl_zusammengefuegt = [3; 7; 3; 6];
[row,col]=size(Spalte_Artikel_zusammengefuegt);                                        
barh(Spalte_Artikel_Anzahl_zusammengefuegt);                                  
set(gca, 'YTickLabel', Spalte_Artikel_zusammengefuegt,'YTick',1:row);
 


Ich habe große Schwierigkeiten, das Problem zu erklären. Hoffe, dass es so passt. Sad

Gruß Fatih

test2.jpg
 Beschreibung:

Download
 Dateiname:  test2.jpg
 Dateigröße:  16.12 KB
 Heruntergeladen:  582 mal
Test.jpg
 Beschreibung:

Download
 Dateiname:  Test.jpg
 Dateigröße:  15.77 KB
 Heruntergeladen:  562 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 19.06.2013, 14:23     Titel:
  Antworten mit Zitat      
Ich habe es mal so hinbekommen wie ich es gerne haben möchte. Leider ist der Code sehr umständlich. Könnt Ihr mir vielleicht Verbesserungsvorschläge machen, wie man den Code geschickter machen könnte oder kennt ihr vielleicht einen anderen schnelleren Weg, der das Problem löst.

Der Code läuft nur für das genannte Beispiel. Wenn ich mal 3 oder mehrere Spalten miteinander vergleichen müsste, wäre das schon sehr viel mehr schreibarbeit in Matlab.

Bin Anfänger und kenne mich leider noch garnicht so gut aus mit MATLAB... Crying or Very sad

Code:

%% Testen, wie man tabellen zusammenführen kann
Spalte_Artikel_one =[{'Auto'};{'Laptop'};{'Fernseher'}];  
Spalte_Artikel_Anzahl_one = num2cell([1; 5 ; 3]);

Spalte_Artikel_two = [{'Auto'};{'Fahrrad'};{'Laptop'}];
Spalte_Artikel_Anzahl_two = num2cell([2; 6 ; 2]);

Table = [Spalte_Artikel_one,Spalte_Artikel_Anzahl_one;Spalte_Artikel_two,Spalte_Artikel_Anzahl_two]; % Zunächst füge ich die Spalten zusammen

u = unique(Table(:,1));             % Hier werden alle doppelten oder mehrfach vorkommenden Einträge (Artikel) entfernt
% [row,col] = size(u);

%%%%%%%
%%%%%%% Ab Hier müsste es doch einfacher möglich sein...oder??
%%%%%%%

content1 = u(1,1);                  % Die einzelnen Zeilennamen aus der neu erstellten Tabelle u entnehmen
content2 = u(2,1);
content3 = u(3,1);
content4 = u(4,1);

[Zeilea,Spaltea] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content1));         % Zeile und Spalte suchen, wo diese Zeilennamen in den ursprünglichen Tabellen vorkommen  
[Zeileb,Spalteb] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content2));
[Zeilec,Spaltec] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content3));
[Zeiled,Spalted] = find(strcmp([Spalte_Artikel_one,Spalte_Artikel_two],content4));

[a,a2]=size(Zeilea);        % Zeilenanzahl bestimmten
[b,b2]=size(Zeileb);
[c,c2]=size(Zeilec);
[d,d2]=size(Zeiled);

if a == 1                                                   % je nachdem, ob der Artikel(z.B. Auto) nur in einer Tabelle oder in beiden Tabellen vorkommt, wird die dazugehörige Anzahl addiert.
Gesamtanzahl_a = Spalte_Artikel_Anzahl_one{Zeilea(1)};
elseif a == 2
Gesamtanzahl_a = Spalte_Artikel_Anzahl_one{Zeilea(1)} + Spalte_Artikel_Anzahl_two{Zeilea(2)};    
end

if b == 1
Gesamtanzahl_b = Spalte_Artikel_Anzahl_one{Zeileb(1)};
elseif b == 2
Gesamtanzahl_b = Spalte_Artikel_Anzahl_one{Zeileb(1)} + Spalte_Artikel_Anzahl_two{Zeileb(2)};    
end

if c == 1
Gesamtanzahl_c = Spalte_Artikel_Anzahl_one{Zeilec(1)};
elseif c == 2
Gesamtanzahl_c = Spalte_Artikel_Anzahl_one{Zeilec(1)} + Spalte_Artikel_Anzahl_two{Zeilec(2)};    
end

if d == 1
Gesamtanzahl_d = Spalte_Artikel_Anzahl_one{Zeiled(1)};
elseif d == 2
Gesamtanzahl_d = Spalte_Artikel_Anzahl_one{Zeiled(1)} + Spalte_Artikel_Anzahl_two{Zeiled(2)};    
end

Gesamtanzahl_tabelle = num2cell([Gesamtanzahl_a; Gesamtanzahl_b; Gesamtanzahl_c; Gesamtanzahl_d]);  % Tabelle mit den addierten Werten wird erstellt
Fertige_Tabelle_zum_plotten = [u,Gesamtanzahl_tabelle];     % die Tabelle, die ich haben möchte ist endlich fertig

[row,col]=size(Fertige_Tabelle_zum_plotten(:,1));           % plot                                    
barh(cell2mat(Fertige_Tabelle_zum_plotten(:,2)));                                  
set(gca, 'YTickLabel', Fertige_Tabelle_zum_plotten(:,1),'YTick',1:row);
hold on    
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.06.2013, 22:33     Titel:
  Antworten mit Zitat      
Hallo derbeshot89,

Ich versuche es mal:
Code:
TableA = {'Auto', 1; 'Laptop', 5; 'Fernseher', 3};
TableB = {'Auto', 2; 'Fahrrad', 6;'Laptop', 2};

foundInB = false(1, size(TableB, 1));

for k = 1:size(TableA, 1)
  index = find(strcmp(TableA{k, 1}, TableB(:, 1)));
  if ~isempty(index)
    TableA{k, 2} = TableA{k, 2} + TableB{index, 2};
    foundInB(index) = true;
  end
end
TableA = cat(1, TableA, TableB(~foundInB, :));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
derbeshot89
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 20.06.2013, 11:52     Titel:
  Antworten mit Zitat      
Perfekt. Ich danke dir Jan Very Happy

Das ist genau das was ich gesucht habe. Echt Klasse Wink
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.