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

Felder als Funktionen definieren ohne Schleifen

 

einfachrolf
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2014, 15:18     Titel: Felder als Funktionen definieren ohne Schleifen
  Antworten mit Zitat      
Ist es möglich, ein Feld einer Matrix als Funktion zu definieren?

Folgende Beispielfälle, welche ich bisher immer mit For-Schleifen lösen musste:

1. Ich will in jedem Feld stehen haben, in welcher Spalte dieses sich befindet

Code:
% Generiere Matrix die angibt, welche Spalte es ist.

anzahl_spalten = 3;
anzahl_zeilen = 2;
zeile = 1:anzahl_spalten; % [1 2 3]
matrix = repmat(zeile,anzahl_zeilen,1);

% Ergebnis ist dann diese Matrix: [1 2 3; 1 2 3]

 


Ist es für dieses Beispiel möglich, eine Felddefinition vorzugeben (also ähnlich wie in Excel)? So dass ich sagen kann: Nimm den Wert der Spalte an.


2. Ich will für ein bestimmtes Feld angeben, wie dieses Feld sich aus anderen Matrizen berechnet.

So wie beispielsweise die Multiplikation für Matrizen festgelegt(Zeile * Spalte) ist, so möchte ich eine eigenen Verrechnungsmethode festlegen wie zum Beispiel. Wenn A,B und C Matrizen sind, so würde ich gerne Feld C(i,j) definieren als:
Code:
C(i,j) = min(A(i,:) + B(:,j)')


Nur wieder möchte ich keine Schleifen benutzen. Wie ist das möglich? (Ich hoffe, dass ich dafür nicht in C Programmieren muss)
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: 03.10.2014, 18:34     Titel: Re: Felder als Funktionen definieren ohne Schleifen
  Antworten mit Zitat      
Hallo einfachrolf,

Zitat:
Ist es möglich, ein Feld einer Matrix als Funktion zu definieren?

Ja, das ist einfach möglich - allerdings in Excel.
Matlab ist dafür nicht geeignet.

Zitat:
Folgende Beispielfälle, welche ich bisher immer mit For-Schleifen lösen musste:

Das verstehe ich nicht. Du hast es in Deinem Beispiel-Code ohne FOR-Schleife gelöst.

Zitat:
1. Ich will in jedem Feld stehen haben, in welcher Spalte dieses sich befindet

Das hört sich nach einem Ansatz an, der sehr indirekt ist. Statt eine solche Matrix zu erstellen, ist es viel einfachen einen Index-Vektor zu verwenden.

Es ist nicht sinnvoll eine so mächtige Sprache wie Matlab auf Biege und Brechen so verwenden zu wollen wie Excel. Theoretisch kann man zwar mit Matlab alles machen, was in Excel auch geht, aber man kann ja auch Berechnungen in PostScript-Code einbauen und den Drucker ein Differential-Gleichungs-System integrieren lassen. Es geht, ist aber nicht praktisch.

Zitat:
Ist es für dieses Beispiel möglich, eine Felddefinition vorzugeben (also ähnlich wie in Excel)? So dass ich sagen kann: Nimm den Wert der Spalte an.

Das ist in Matlab ganz einfach:
Code:
index = 1:NumberOFColums


Zitat:
Code:
C(i,j) = min(A(i,:) + B(:,j)')

Nur wieder möchte ich keine Schleifen benutzen.

Hier ist das einzige Problem, dass Du keine Schleife benutzen möchtest. Wieso nicht? Es spricht doch gar nichts dagegen.

Code:
A = rand(3, 3);
B = rand(3, 3);
C = zeros(3, 3);
for i1 = 1:3
  for i2 = 1:3
    C(i1, i2) = min(A(i1, :) + B(:, i2).');
  end
end

Falls die Matrizen groß sind (vielleicht viel mehr als 10'000 Zeilen oder Spalten), könnte dies schneller sein:
Code:
Bt = B.';
for i1 = 1:3
    C(i1, :) = min(bsxfun(@plus, A(i1, :), Bt), 2);
end

Passt das? Es könnte aber auch langsamer sein, denn die temporären Array, die BSXFUN hier erstellt, benötigenm viel Speicherplatz. Probiere es also einfach mal aus, was effizienter für Deine typischen Daten ist.

Zitat:
(Ich hoffe, dass ich dafür nicht in C Programmieren muss)

Das ist lustig! In C wird es garantiert sehr viel komplizierter!

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 03.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.10.2014, 22:04     Titel:
  Antworten mit Zitat      
Ich möchte hier mal meine Implementierung posten.

Der Code von Jan S mit der bsxfun funktioniert nicht richtig.

Ich habe aber mal zur Demonstration meine Implementierung ohne Schleifen hier:

Code:

% init data
N = 30; % Matrixgröße

A = magic(N);
B = magic(N);
C = zeros(N);


% way1 - for loop normal
tic
for i1 = 1:N
  for i2 = 1:N
    C(i1, i2) = min(A(i1, :) + B(:, i2).');
  end
end
toc
sol1 = C;

% way2 - for loop by bsx
% % tic
% % Bt = B.';
% % for i1 = 1:N
% %     C(i1, Smile = min(bsxfun(@plus, A(i1, Smile, Bt), 2);
% % end
% % toc
% % sol2 = C;
% -> kommt zur Fehlermeldung: Subscripted assignment dimension mismatch.



% way3 - without loop
top_layer = zeros(1,N,N); % diesen muss ich für X Operationen nur 1 mal bereitstellen. Daher zähle ich ihn nicht zur Zeit. Matlab empfiehlt mir hier keine Preallokation, da dies scheinbar sowieso im nächsten Schritt erfolgen muss.

tic
top_layer = permute(A,[3 2 1]);
temp_a = repmat(top_layer,N,1,1);
temp_a = permute(temp_a,[2 1 3]);

temp_b = repmat(B,1,1,N);

temp_c = temp_a + temp_b;
temp_c = permute(temp_c,[3 2 1]);
C = min(temp_c,[],3);  
toc

sol3 = C;


Weg 3 ist vermutlich nicht sofort einleuchtend. Im Prinzip kopiere ich mir Zeilen und Spalten nur mehrmals in zwei 3D-Matrizen. Durch die Drehungen kann ich diese dann einfach miteinander verrechnen.

Das seltsame ist, dass nach der ersten Ausführung Weg1 schneller ist als Weg3. Bei jeder folgenden Ausführung jedoch Weg3. Außerdem ist Weg3 nur bis zu einer bestimmten Größe für N schneller. Dann holt Weg1 nämlich wieder auf. Mich interessieren aber konkret die Fälle für N von 11 bis 48.
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.