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

Vektorisierung einer Funktion mit Summenzeichen

 

gragi
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 03:24     Titel: Vektorisierung einer Funktion mit Summenzeichen
  Antworten mit Zitat      
Hallo liebe Forumsmitglieder,
ich bin seit einigen Monate passiver Mitleser eures Forums und möchte mich zuallererst einmal bei euch für eure wirklich hilfreichen Posts bedanken!

Für folgendes Problem bin ich leider nicht fündig geworden. Vieleicht kann mir ja jemand weiterhelfen:

Um meinen Code effizienter zu machen, muss eine Funktion vektorisiert werden. Hier ein Minibeispiel der ursprünglichen Funktion:

Code:

function [return] = Funktion( a ,b)
return=sum(a+b);
end

a=[1 2];
b=[1];
result=Funktion(a,b); %=1+1+2+1=5
 


Da es sich bei a und b aber nun um Vektoren (im Fall von a um eine Matrix) handeln soll, funktioniert das Folgende nun nicht mehr:
Code:

function [result] = VektorFunktion( a_vec ,b_vec)
result=sum(a_vec+b_vec);
end

a_vec=[ 1 2;
             3 4];
b_vec=[ 1;
             2];

result=VektorFunktion(a_vec,b_vec);  %=16
 


Als Ausgabe erhoffe ich mir aber den folgenden Vektor:
Code:

[1+1+2+1;3+2+4+2] -> [5;11]
 



Wenn ich die Summe ausschreibe, bekomme ich das gewünschte Ergebnis:
Code:

function [result] = VektorFunktion( a_vec ,b_vec)
result=a_vec(:,1)+b_vec+a_vec(:,2)+b_vec;
end
 


Leider würde dies den Code extrem unleserlich machen, da der Vektor a_vec recht viele Spalten besitzt.

Hat jemand unter euch eine Idee wie ich das Ganze anders lösen könnte?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2015, 10:15     Titel:
  Antworten mit Zitat      
Hallo,

da die Funktion so recht ungewöhnlich ist, bitte auch nochmal die Funktion an sich überprüfen.

Code:
function [result] = VektorFunktion( a_vec ,b_vec)
N = size(a_vec, 2); % oder N = 2? Wie soll das für a_vec mit > 2 Spalten aussehen?
result=sum(a_vec, 2) + N*b_vec;
end


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 10:37     Titel: ...
  Antworten mit Zitat      
Ich würde hier mit einer kleinen Schleife arbeiten. So erhältst du dir die Unabhängigkeit gegenüber der größe von a_vec und b_vec.

Code:
% hier mal in 3 Zeilen
function [result] = VektorFunktion( a_vec ,b_vec)
for i = 1:length(a_vec(1,:))
    result(i,1)=sum(a_vec(i,:)+b_vec(i,:));
end
end
 


Gruz Martin
 
Harald
Forum-Meister

Forum-Meister


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

Anmerkung: auch mein Vorschlag ist von den Dimensionen von a_vec und b_vec unabhängig. Zusammenpassen müssen sie natürlich.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 12:01     Titel:
  Antworten mit Zitat      
Hallo Harald, Hallo Martin,
vielen Dank für eure Vorschläge. Die Schleife wird wohl nicht in Frage kommen, da ich so wieder die Effizienz der Vektoroperation verlieren würde. Haralds Vorschlag muss ich nochmal genau ansehen, bin mir aber gerade noch nicht sicher ob sich das ganze so auf meine Funktion übertragen lässt.

Ich glaube aber mir bleibt fast nichts anderes übrig, als die Summe auszuschreiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
bin mir aber gerade noch nicht sicher ob sich das ganze so auf meine Funktion übertragen lässt.

Bei deinem Testbeispiel erhältst du damit das gewünschte Ergebnis.
Wenn du in anderen Beispielen nicht das gewünschte Ergebnis erhältst, dann bitte ein solches Beispiel zur Verfügung stellen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 13:37     Titel:
  Antworten mit Zitat      
Hallo zusammen,
hier mal ein Beispiel das meinem Problem näher kommt:
Code:

function [result] = VektorFunktion( a ,b,c)
result=sum(min(b,max(c-a,0)));
end

% a ist eine Matrix
% b und c sind Vektoren
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2015, 13:46     Titel:
  Antworten mit Zitat      
Hallo,

ist das nun Code, der die gewünschten Ergebnisse liefert? Dann wäre das Problem ja erledigt.
Oder Code, der nicht die gewünschten Ergebnisse liefern? Dann wäre die Frage, wie die Ergebnisse in diesem Fall aussehen sollen (und, falls es nicht ganz offensichtlich ist, wie man auf diese Ergebnisse kommt). Also die Informationen, die du eingangs zur Verfügung gestellt hast, nur mit einem etwas komplexeren Beispiel.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 13:57     Titel:
  Antworten mit Zitat      
Sorry. Hier nochmal ausführlicher:
Folgender Code liefert leider nicht das gewünschte Ergebnis:
Code:

function [result] = VektorFunktion(a,b,c)
result=sum(min(b,max(c-a,0)));
end

% a ist eine Matrix
% b und c sind Vektoren
 


Code:

a=[1 2;
     3 4];
b=[5;
     6];
c=[7;
     8];

result=VektorFunktion(a,b,c);
% "result" sollte dann so aussehen: (macht es aber nicht)
% result(1)=min(5,max(7-1,0))+min(5,max(7-2,0))=10;
% result(2)=min(6,max(8-3,0))+min(6,max(8-4,0))=9;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2015, 14:38     Titel:
  Antworten mit Zitat      
Hallo,

der Inhalt der Funktion könnte so aussehen:
Code:
result=sum(bsxfun(@min, b ,max(bsxfun(@minus, c, a),0)), 2);
oder
Code:
result=sum(bsxfun(@min, b ,max(bsxfun(@minus, c, a),0)));


In deinem Beispiel ist die Matrix, die summiert wird, symmetrisch. Das bedeutet, dass Zeilen- und Spaltensumme gleich ist. Mir ist also nicht klar, was du in allgemeinen Fällen erhalten möchtest.

Grüße,
Harald
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.