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

Elgenates Befüllen einer Matrix

 

Gigastorm
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2015, 00:58     Titel: Elgenates Befüllen einer Matrix
  Antworten mit Zitat      
Elgenates Befüllen einer Matrix:
Ich soll als Aufgabe möglichst elegant die Matrizen:
\begin{Bmatrix} 1 & 2 & 3 & 4 \\ 6 & 7 & 8 & 9 \\ 11 & 12 & 13 & 14 \\16 & 17 & 18 & 19\end{Bmatrix}, \begin{Bmatrix} 1 &- 2 & 3 & -4 \\- 6 & 7 &- 8 & 9 \\ 11 & -12 & 13 & -14 \\-16 & 17 &- 18 & 19\end{Bmatrix}
generieren.

Das Ziel der Aufgabe ist jetzt nicht
Zitat:
A=[[1:4];[6:9];[11:14];[16:19]]

zu programmieren, sondern es so zu programmieren, dass es schnell auf hohe Zeilenanzahl erweitert werden kann. Habt ihr einen Tipp für mich?
Bei der zweiten Matrix wird das Minus "schachbrett"-mäßig verteilt also multipliziert mit dem Faktor (-1)^{i+j}*\begin{Bmatrix} 1 & 2 & 3 & 4 \\ 6 & 7 & 8 & 9 \\ 11 & 12 & 13 & 14 \\16 & 17 & 18 & 19\end{Bmatrix} wobei i die Zeile und j die Spalte ist.
Den Vektor [1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19] kann ich erzeugen durch:
Code:
s=[1:19];
for i=1:19
    if (mod(i,5)==0)
    s(i)=[];
    end
end
 

Aber eine Schleife ist ja nun auch nicht effizient (Vektorisierung ist immer schneller und vorzuziehen) und wie füge ich das in meine 4x4-Matrix ein?
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 13.11.2015, 11:10     Titel:
  Antworten mit Zitat      
gibt da einige varianten.
du könntest zb mit reshape arbeiten die spalte mit den 5end abschneiden. man könnte auch mit bsxfun und @plus arbeiten.
für das schachbret hast du ja schon den mod befehl gefunden.
gibt bestimmt noch viel mehr lösungen Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 13.11.2015, 11:28     Titel:
  Antworten mit Zitat      
Ich würde an deiner Stelle einfach mal die Array Manipulation - Befehle in der Matlabhilfe durchschauen. Da solltest du fündig werden. (Functions -> Mathematics -> Arrays and Matrices -> Array Manipulation)
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Gigastorm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2015, 12:59     Titel:
  Antworten mit Zitat      
Hallo,
Danke schonmal! Entschuldigung für die späte Antwort.
Folgende Code funktioniert. Geht es eleganter?
Code:
B=1:20;
C=(reshape(B,5,[]))';
C(:,5)=[];
for i=1:size(C,1)
    for j=1:size(C,2)
        if (mod(i+j,2)==1)
            C(i,j)=-C(i,j);
        end
    end
end
C
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.11.2015, 13:52     Titel:
  Antworten mit Zitat      
vielleicht so
Code:
D=C;
D=D.*sign(mod(C,2)-0.5);

_________________

richtig Fragen
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: 20.11.2015, 14:48     Titel: Re: Elgenates Befüllen einer Matrix
  Antworten mit Zitat      
Hallo Gigastorm,

Dass Vektorisieren immer schneller ist als Schleifen ist ein Gerücht, das aus den Zeiten von vor Matlab 6.5 stammt, also seit mehr als 10 Jahren nicht mehr Stand der Technik ist. Matlab's JIT-Acceleration kann Schleifen drastisch beschleunigen, wenn man einige Regeln berücksichtigt. Und dann ist die Größe der temporär erzeugten Arrays der limitierende Faktor und Schleifen haben eher die Möglichkeit vollständig im Processor-Cache abzulaufen ohne auf das langsame RAM zuzugreifen.

In Deinem Fall ist das jedoch unerheblich, da es nur um Micro-Sekunden geht.

Anmerkung:
Zitat:
A=[[1:4];[6:9];[11:14];[16:19]];
% Besser:
A=[1:4; 6:9; 11:14; 16:19];

"a:b" ist bereits ein Vektor, so dass man es nicht per [] Operator horizontal verbinden muss.

Elemente in einer Schleife aus einem Array zu löschen ist extrem resourcen-verzehrend. Denn es wird jedesmal ein neues Array erzeugt und die Daten des alten kopiert. Hier ist Vektorisierung besser:
Code:
C = 1:20;
C(5:5:20) = [];
C = reshape(C, 4, 4);

Dabei wird "linear indexing" verwendet. Es lohnt sich, dies mal genauer anzuschauen. Und so kann man auch das Vorzeichen ändern:
Code:
D = C;
disp(D(2:2:end))

Den letzten Schritt habe ich mal weggelassen.
Viel Erfolg, Jan

Zuletzt bearbeitet von Jan S am 21.11.2015, 14:08, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Gigastorm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2015, 19:57     Titel:
  Antworten mit Zitat      
danke
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.