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

Funktionsweise einer Funktion und Stacksize/Memory erhöhen

 

shalec
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 11:43     Titel: Funktionsweise einer Funktion und Stacksize/Memory erhöhen
  Antworten mit Zitat      
Hallo,
ich habe zwei Fragen:

    1.) Ich habe ein kleines Programm geschrieben, dabei trat eine unerwartete Ausgabe auf.
    Code:
    function y=arithmetik(z,n)
    %n Nachkommastellen,
    %z die auszugebene Zahl
    formatSpec='%12.*f\n';
    y=fprintf(formatSpec, n, z);
    end

    Vorweg: Ich habe das "y=" weg genommen, da das nun unnötig wurde.
    Die Ausgabe war zunächst ganz korrekt, die eingegebene Zahl z mit den entsprechenden Nachkommastellen.
    Code:
    arithmetik(0,10)
    0.0000000000

    ans =

        13


    Ich vermute, dass diese 13 die Länge des Strings der Ausgabe ist. Aber womit habe ich der Funktion diese Anweisung gegeben, dass dies zu messen sei?


    2.) Wie kann ich die Höhe des Speichers erhöhen? Ich möchte mit Zahlen arbeiten (Primzahlen) die in einer Größenordnung bis 2^2048 sind. Mein Matlab teilt mir mit, dass dies nur bis 2^1023 möglich sei. Danach erscheint Inf. (Student mit Symulink, R2014a)
    Auch würde ich dies gerne auf For-Schleifen ausweiten. Ich fange bei z.B. floor(sqrt(n)) an, gehe bis floor(sqrt(sqrt(n))) jeweils und prüfe, ob das jeweilige Folgenglied ein Teiler von n ist. Dabei spuckt mir die For-Schleife allerdings häufig einen Fehler aus, dass die Iterationsschritte das Limit übersteigen. Hier also zwei Fragen:

    Wie erhöhe ich den Speicher, der Matlab zur Verfügung gestellt wird? (Kann ich hierfür Festplattenspeicher reservieren? Ich habe 8gb DDR3 derzeit verbaut, 750gb SATA2, werde aber bald eine SSD zusätzlich einbauen - für das System und Arbeitsintensive Programme.)

    Wie erhöhe ich das Limit der Iterationsschritte einer For-Schleife?

    Anmerkung: Ziel wird mittelfristig der Umstieg auf elliptische Kurven sein. Allerdings will ich die bekannten Algorithmen zur Lösung des DLP (und Erzeugung) einmal selber schreiben und zum Laufen bringen. Das ergänzen um EC wird dann nicht weiter schwer.


Viele Grüße und vielen Dank schonmal.
Shalec
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: 17.05.2014, 12:11     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Aber womit habe ich der Funktion diese Anweisung gegeben, dass dies zu messen sei?

Indem du ein Rückgabeargument zurückgeholt hast, siehe Doku von fprintf
Zitat:
nbytes = fprintf(fileID,formatSpec,A1,...,An)
additionally returns the number of bytes that fprintf writes.


Zitat:
Wie erhöhe ich den Speicher, der Matlab zur Verfügung gestellt wird?

Deine Problematik hat nichts mit dem Speicher von MATLAB zu tun, sondern dem im Datentyp double unterstützten Zahlenbereich.
Solche Zahlen kannst du mit sym definieren und mit vpa darstellen, z.B.
Code:
a = sym(2)^sym(2048)
double(log(a) / log(2)) % zur Kontrolle
vpa(a, 10)


Zitat:
Wie erhöhe ich das Limit der Iterationsschritte einer For-Schleife?

Eine for-Schleife hat erst mal keine Limitierung an Iterationsschritten.
Bitte den verwendeten Code und die zugehörige Fehlermeldung / Probleme zeigen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 15:18     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

Zitat:
Aber womit habe ich der Funktion diese Anweisung gegeben, dass dies zu messen sei?

Indem du ein Rückgabeargument zurückgeholt hast, siehe Doku von fprintf
Zitat:
nbytes = fprintf(fileID,formatSpec,A1,...,An)
additionally returns the number of bytes that fprintf writes.


Zitat:
Wie erhöhe ich den Speicher, der Matlab zur Verfügung gestellt wird?

Deine Problematik hat nichts mit dem Speicher von MATLAB zu tun, sondern dem im Datentyp double unterstützten Zahlenbereich.
Solche Zahlen kannst du mit sym definieren und mit vpa darstellen, z.B.
Code:
a = sym(2)^sym(2048)
double(log(a) / log(2)) % zur Kontrolle
vpa(a, 10)


Zitat:
Wie erhöhe ich das Limit der Iterationsschritte einer For-Schleife?

Eine for-Schleife hat erst mal keine Limitierung an Iterationsschritten.
Bitte den verwendeten Code und die zugehörige Fehlermeldung / Probleme zeigen.

Grüße,
Harald


Hallo und vielen Dank schonmal.
ich reduziere den Code mal, sodass ein Fehler entsteht..
Code:
function Finde(n)
Wurzel=sqrt(n);
y=[];
for m=Wurzel:-1:1
     if n/m==floor(n/m)
         y(end+1)=m;
     else break;
     end
end
disp(num2str(y))
end
 

Ausgabe: [Warnung]
Code:
Warning: FOR loop index is too large. Truncating to 281474976710655.


Das Prog. rechnet dann mit der truncated Version der Zahl weiter. Dies führt aber gerade bei einem Produkt zweier großer Primzahlen zu einem Problem.

Ist
Code:
eigentlich ein deterministischer oder probabilistischer Test? - selber beantwortet. Zweiteres, nach Miller-Rabin. Gibt es auch die Methode nach Agrawal (AKS-Primzahltest)?
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: 17.05.2014, 16:48     Titel:
  Antworten mit Zitat      
Hallo,

die entscheidende Information wäre: mit welchem n rufst du den Code auf?

Die Warnung ist durchaus verständnis, denn du befindest dich da im Petaflop-Bereich, also Größenordnungen für die man Superrechner bräuchte. Selbst wenn MATLAB die Warnung nicht bringen würde, würdest du es also Jahre dauern, bis die Rechnung fertig wird.

Da solltest du schon versuchen, den Algorithmuis effizienter zu gestalten. Um nur ein Beispiel zu nennen: wenn 2 eine Zahl nicht teilt, dann braucht man alle Vielfache von 2 gar nicht mehr zu testen.

Zudem solltest du dir über die Grenzen von Gleitkommaarithmetik klar sein, z.B.
Code:
n = 12345678901234567;
floor(n/2) == n/2


Eine Abhilfe s.o. - symbolisch bzw. mit vpa dauern die Rechnungen aber eher noch länger.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 11.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.05.2014, 18:22     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

die entscheidende Information wäre: mit welchem n rufst du den Code auf?

Die Warnung ist durchaus verständnis, denn du befindest dich da im Petaflop-Bereich, also Größenordnungen für die man Superrechner bräuchte. Selbst wenn MATLAB die Warnung nicht bringen würde, würdest du es also Jahre dauern, bis die Rechnung fertig wird.

Da solltest du schon versuchen, den Algorithmuis effizienter zu gestalten. Um nur ein Beispiel zu nennen: wenn 2 eine Zahl nicht teilt, dann braucht man alle Vielfache von 2 gar nicht mehr zu testen.

Zudem solltest du dir über die Grenzen von Gleitkommaarithmetik klar sein, z.B.
Code:
n = 12345678901234567;
floor(n/2) == n/2


Eine Abhilfe s.o. - symbolisch bzw. mit vpa dauern die Rechnungen aber eher noch länger.

Grüße,
Harald


Ach..da habe ich total vergessen, das n anzuhängen.. Beispielsweise mit n=2^(1020)+1;
Ich reduziere die Rechendauer schon durch die Einschränkung (was fast immer zum Ziel führt) indem ich von
Code:
Anfang=sqrt(n);
Ende=sqrt(Anfang);
 


durchlaufen lasse. Dann hatte ich mir überlegt noch folgendes einzubetten: Falls 2 kein Teiler mehr ist (d.h. ich filtere erst alle 2er Potenzen raus) gehe mit Schrittweite "2" vor. (Damit habe ich nur ungerade Zahlen durch die ich teilen muss). Aber der Punkt mit den Grenzen der Gleitkommaarithmetik ist interessant. Ich hatte vergessen, dass Matlab Nachkommastellen ab der 16. abschneidet. Damit werden Rundungen ungenau, und vermeintliche Teiler gefunden. Genauso wie bei dem Beispiel, hier genügt schon eine Nachkommastelle. Vielen Dank für den Hinweis!

Da muss ich mir dann wohl noch ein wenig was überlegen. Ich hatte erstmal an eine funktionierende Version gedacht (eine Alpha so gesehen). Diese wollte ich dann Schritt für Schritt verbessern (Erst die Richtigkeit der Ergebnisse, dann die Effizienz).


------ Effizienz
Ist es in Matlab überhaupt effizient Variablen wie "Wurzel" zu speichern? Ich stelle mir den Grund dafür wie folgt vor. Es ist einfacher einen Wert zu kopieren, als ihn ständig neu zu berechnen. Sehe ich das für Matlab ebenfalls richtig, oder hat Matlab hierfür einen Zwischenspeicher?



----------- Problem: Petaflop
Die Problematik mit dem Petaflopbereich könnte doch durch effizientes Multithreading (Addon werde ich mir noch kaufen) verkleinert werden? Mein Laptop hat einen i7 mit 4 Kernen, mit 8 logischen Prozessoren zu je 2,2 GHz (falls Turbo Boost unterstützt wird sogar 3,2 GHz) und verfügt über die Speicherverteilung/Kommunikation der 4. Generation der Intel Prozessoren. Es wird zwar (je nach Abstand der gewählten Primzahlen) lange dauern, diese zu lösen mit einem rekursiven Verfahren.




------------ Alternative Lösungsstrategie
Ich kann auch meinen Laptop so konfigurieren, dass dieser effiziente Jobverteilungen vornimmt und diese jeweils an die Uni-Rechner weiterleitet und dort das gesamte Netzwerksystem arbeiten lässt. Jeder Computer dort trägt dann seine Ergebnisse in eine eigene Datei ein, die dann alle zusammengeführt und zurück geschickt werden, wenn alle fertig sind. (#Dateien werden erwartet, End-Code wird gelesen, Falls #End==#Dateien -> merge, send)

In der Uni existieren ~27(?) Matlablizensen, die über Putty, SSH & co gestartet werden können. Croudcalculating. Very Happy (hatte auch schon an Java-Script gedacht.. Idee war es dies auf einer viel besuchten Seite im Hintergrund laufen zu lassen und die Prozessoren der Nutzer zu verwenden. Gesetze hindern einen nur daran :-> )


--------- Distanzierung
Ich will, im Zusammenhang zu obigen, nochmal klar stellen, dass ich Matlab nur zu Studienzwecken nutze und keinen schadhaften Sinn verfolge. Alle Probleme, die ich derzeit löse, sind selbst konstruierte.



Viele Grüße und vielen Dank nochmal!
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: 17.05.2014, 19:04     Titel:
  Antworten mit Zitat      
Hallo,

@ Effizienz:
Ich sehe nicht, was gegen die Abspeicherung einer Variablen spricht.

@ Petaflop:
Ich würde die Algorithmen mal für relativ kleine Probleme testen und dann schauen, wie zeitintensiv das ist. Daraus kannst du dann abschätzen, wie hoch die Rechenzeit für "große" Probleme ist.

@ Lösungsstrategie:
Parallel Computing Toolbox (http://www.mathworks.de/products/parallel-computing/) bietet da in Verbindung mit MATLAB Distributed Computing Server (http://www.mathworks.de/products/distriben/index.html) deutlich komfortablere Möglichkeiten.

@ Distanzierung:
Ist ja beruhigend :)

Grüße,
Harald
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: 18.05.2014, 10:54     Titel:
  Antworten mit Zitat      
Hallo,

noch eine kleine Anmerkung zum Rechenaufwand, den du bei einer for-Schleife "for m=Wurzel:-1:1" hast:

Wenn n = 2^1020 + 1, dann bräuchten die Top 500 Supercomputer dieser Welt zusammen für sqrt(n) viele Berechnungen größenordnungsmäßig so viele Jahre:

Code:
sqrt(n) / 250e15 / 3600 / 24 / 365

ans =

  4.2516e+128 % Rechenzeit in Jahren


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.