Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Frage zur Programmerstellung mit C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.10.2012, 21:36 Uhr
~Anatol
Gast


hey,
ich musste für meine diplomarbeit ein programm schreiben. das ist zu 90% fertig. allerdings muss ich noch einen teil hinzufügen, der die laufzeit beschleunigen soll.
habe eine matrix mit werten, die innerhalb der schleifen berechnet werden. da diese matrix viele nullen enthalten wird, soll diese matrix durch verkettete listen ersetzt werden. dazu soll jede zeile eine liste darstellen.

ich kenn mich mit c++ kaum aus, und mein programm ist sehr laienhaft. habe den ganzen code einfach runtergeschrieben, ohne klassen usw.

die nullen sollen also nicht gespeichert werden. nur alle werte die >0 sind.

vielleicht kann man es mit einem vektor lösen, der ein pair speichert (also die ehemaligen zeilen- und spaltennummer) und deren wert.

z.B.: werte abh. von i/j
3 0 5
0 2 0
0 0 0

speichern als i,j,&wert: (1,1,3) (1,3,5) (2,2,2)

wahrscheinlich kann man es als geschachtelter vektor schreiben, wobei der pair vektor dann i und j zurückgibt und der andere vektor den wert? (hoffe das es so geht)

brauch den wert abhängig von i und j für eine spätere berechnung

DANKE für jede Hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.10.2012, 22:37 Uhr
Hans
Library Walker
(Operator)


Hi,

was Du da vor hast, ist mit verketteten Listen machbar. Aber sofern Du nicht wirklich mit C++, sondern nur mit C arbeitest, wird es etwas umständlch einzubauen sein. Schick doch mal etwas Code aus dem hervor geht, wie Du Dir die Umsetzung von dem, was Du da beschrieben hast vorstellst. Diese Idee ist in der Informatik übrigens unter der Bezeichnung "dünn besetzte Matrizen", oder "schwach besetzte Felder" oder so ähnlich bekannt.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.10.2012, 08:54 Uhr
ao

(Operator)


Hans hat recht, das gibt es schon. Auf Englisch heißt es "sparse matrix", da findest du noch viel mehr. Erfinde das nach Möglichkeit nicht neu.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.10.2012, 16:46 Uhr
~Anatol
Gast


Hey danke euch beiden
Versuche damit mal klar zu kommen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.10.2012, 16:54 Uhr
~Anatol
Gast


ach und und um auf @hans nochmal zu antworten:

hatte mir es so vorgestellt, dass man vielleicht statt 2 elementen (pair), 3 elemente im vektor speichert (also zusätzlich zum pair f_i und f_r den zugehörigen Wert Extra(f_i, f_r))

so, dass man später bei der Profitberechnung (bei findNeighbor) die Schleifen durchläuft
f_i ++
f_r ++
wenn (vector.first==f_i && vector.second == f_r)
{
P(f_i,f_r) = G - V + E(f_i,f_r)
}
sonst
P = G-V

hoffe ich hab das jetzt einigermaßen verständlich beschrieben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2012, 23:16 Uhr
0xdeadbeef
Gott
(Operator)


Da scheint mir ne verlinkte Struktur eigentlich etwas unglücklich gewählt -- du müsstest ja jedes mal die ganze Liste durchlaufen, um deine Koordinate zu finden.

Wenn der Vektor sortiert ist, kommt man mit binärer Suche hin (std::lower_bound respektive std::upper_bound), aber wenn die Daten aus einer vertrauenswürdigen Quelle stammen, könnten Hashtables an Performance gut was reißen. Etwa

C++:
std::tr1::unordered_map<unsigned, std::tr1::unordered_map<unsigned, double> > sparse_matrix;


(bzw. std::unordered_map, wenn du schon C++11 benutzen kannst).

Ansonsten gibt es in Boost einige entsprechende Klassenvorlagen, wobei ich jetzt nicht weiß, wie zugänglich Boosts UBLAS-Implementation für dich ist -- es klingt mir ein bisschen so, als schriebest du weniger C++ als C mit cout statt printf.

Eine verlinkte Struktur scheint mir jedenfalls wenig sinnvoll, wenn du dir um Speicher- und Laufzeitverbrauch Sorgen machst; diese Dinge arbeiten nicht gut mit den Caching-Mechanismen moderner CPUs zusammen, und du hättest für jede belegte Koordinate einen mehrfachen Speicheroverhead.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: