Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Zugriff auf und Positionieren in Array

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
05.07.2008, 18:22 Uhr
Arno



Sorry - wird morgen mit Leben gefüllt
Dieser Post wurde am 05.07.2008 um 18:27 Uhr von Arno editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.07.2008, 00:29 Uhr
Arno



So - jetzt aber

Ausgangslage ist die Programmierung einer Matrizenmultiplikation: F * u = f
Hierbei ist F eine n x m Matrix wobei die Spaltenzahl immer um eins größer als die Zeilenzahl n ist. Die Anzahl der Zeilen wird am Anfang des Programms abgefragt und m entsprechend initialisiert. Die Matrix u ist eine einspaltige Matrix m x 1 und f dann entsprechend ebenfalls eine einspaltige Matrix n x 1.

Nun zu meinem Problem: Die Matrix F sieht wie folgt aus


Code:
       1        2         3        ...       n-1         n          n+1
1   1/b1    -1/b1                
2            1/b2        -1/b2            
.
.                              ...    ...        
n-1                                         1/b(n-1)    -1/b(n-1)    
n                                                          1/bn    -1/bn



Zum Einlesen der Werte von b habe ich im Programm eine n x 1 Matrix programmiert.
Mein Problem ist nun das Auslesen und richtige Positionieren der B Werte in einer Schleife die die F Matrix erzeugt.
Zur Zeit arbeite ich mit Pointerpointern was dann wie folgt aussieht:



C++:
// Eindimensionales Feld von Zeigern auf Zeilen anlegen und einlesen der Breiten b
      
        pBreite = new double*[bz];
        for (int i=0;i<bz;i++)
        {
            pBreite[i] = new double[bs];
            cout<<"Eingabe der Breite b von Scheibe "<<i+1<<": ";
            cin>>**(pBreite+i);
        }



bz steht für die Zeilenanzahl von b, bs für die Spaltenzahl. Beide Größen wurde vorher im Programm schon bestimmt.

Bei der Programmierung der Matrix F war mein Gedankengang folgender:
- wenn die Spaltennummer kleiner als die Zeilennummer ist schreibe 0 in das entsprechende Matrizenelement
- wenn Zeilennummer und Spaltennummer gleich sind schreibe 1/b-Wert der entsprechenden Zeile in das Matrizenelement – z.B.: Zeile 2 1/b2
- wenn die Spaltennummer um eins größer ist als die Zeilennummer schreibe –1/b-Wert der entsprechende Matrizenelement
- wenn die Spaltennummer um 2 oder mehr größer ist als die Zeilennummer schreibe 0 in das entsprechende Element


C++:
// Mehrdimensionales Feld von Zeigern auf Zeilen anlegen zur Erzeugung der Matrix F und einlesen der Breiten b
    
        pMatFs = new double*[Fsz];
        for (int i=0;i<Fz;i++)
        {
            for (int j=0;j<Fs;j++)
            {
                if (j<Fss)
                {
                pMat[i][j] = 0;
                }
                else if (j=Fs)
                {
                    pMat[i][j] = 1/pBreite[i];
                }
                else if (j=Fs+1)
                {
                    pMat[i][j] = -1/pBreite[i];
                }
                else if (j>Fs+1)
                {
                    pMat[i][j] = 0
                }
            }
        }



Fz repräsentiert in obiger Schleife die Zeilenzahl, Fs entsprechend die Spaltenzahl.
Leider funktioniert es noch nicht so wie gewünscht, deshalb mein Posting hier in der Hoffnung auf Hilfe bzw. Lösungshinweise.
Mir stellen sich hier noch folgende Fragen:

- wäre es sinnvoller/einfacher die Matrix b als Vektor zu definieren/programmieren vector<double> b(bz) das es sich ja in diesem Fall nur um ein eindinemsionales Feld
- kann ich aus der Schleife der F-Matrix heraus die b-Matrix überhaubt so ansprechen? Der Gültigkeitsbereich von pBreite[] wurde ja nicht verlassen
- Ich habe mit i und j Laufvariablen für die Zeilen und Spalten definiert – ich ahne aber das nicht der von mir gewünschte Effekt, nämlich das Ansprechen der gleichen Zeilen- bzw. Spaltennummer erreicht wird, sondern die jeweilige Anzahl der Zeilen/Spalten.

Für Hinweise/Anregungen//Lösungs-)Vorschläge wäre ich überaus dankbar

Arno

Dieser Post wurde am 06.07.2008 um 00:31 Uhr von Arno editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2008, 21:58 Uhr
kronos
Quotenfisch
(Operator)


Hallo,
wofür machst'n das? Es gibt 'ne Menge sehr gute libs für lineare Algebra, z.B. CBLAS.
Ansonsten, falls du das aus Langeweile machst: du musst doch eigentlich nur die Skalarprodukte von u mit den Spaltenvektoren von F berechnen... wie kommst du auf Nullen und Divisionen?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.07.2008, 16:35 Uhr
Arno



Aus Langeweile mache ich es nicht, sondern weil ich es lernen soll
Mit einer lib(rary) möchte ich nur ungern arbeiten - CBLAS sagt mir z.B. auch nichts.

Was den Rest deiner Antwort angeht bin ich mir nicht sicher ob ich richtig verstanden wurde, deshalb nochmal ein paar zusätzliche Worte:

F ist wie gesagt eine n x m Matrix, wobei die Spaltenanzahl um eins größer ist als die Zeilenzahl, also m = n+1
u ist eine einspaltige Matrix mit m Zeilen.

Wie ich die Matrix F mit der Matrix u multipliziere ist mir schon klar, es geht mir um den Aufbau/die Programmierung der Matrix F. Dafür benötige ich die Werte b1 bis bn die ich
vorher einlese (siehe Programmcode oben).
In der Matrix F tauchen die Werte dann entweder als 1/b, -1/b oder gar nicht auf, daher
komme ich auch auf die Nullen bzw. die Divisionen.

Ich schreibe den Aufbau der Matrix F nochmal in Worten:

1. Zeile, 1. Spalte: 1/b1
1. Zeile, 2. Spalte: -1/b1
Alle anderen Spalten der 1. Zeile sind 0

2. Zeile, 1. Spalte: 0
2. Zeile, 2. Spalte: 1/b2
2. Zeile, 3. Spalte: -1/b2
Alle weiteren Spalten der 2. Zeile sind 0

3. Zeile, 1. Spalte: 0
3. Zeile, 2. Spalte: 0
3. Zeile, 3. Spalte: 1/b3
3. Zeile, 4. Spalte: -1/b3
Alle weiteren Spalten der 3. Zeile sind 0

So setzt sich das Schema bis zur letzten (n-ten) Zeile fort. Die Belegung der n-ten Zeile lautet dann:
n-te Zeile, 1. Spalte bis n-1. Spalte: 0
n-te Zeile, n. Spalte: 1/bn
n-te Zeile, n+1. Spalte: -1/bn

Ich hoffe es ist jetzt klarer um was es mir geht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.07.2008, 22:21 Uhr
berniebutt



Wenn Du was lernen willst oder sollst, liegst Du mit dieser Frage vielleicht falsch hier. Dir geht es schlicht um einen Algorithmus für Matrixoperationen. So etwas hat mit C/C++ (WinApi,Konsole) wenig zu tun!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.07.2008, 01:28 Uhr
kronos
Quotenfisch
(Operator)


Ah, hab' jetzt begriffen was du meinst...

Zitat von Arno:

- wäre es sinnvoller/einfacher die Matrix b als Vektor zu definieren/programmieren vector<double> b(bz) das es sich ja in diesem Fall nur um ein eindinemsionales Feld

Kommt darauf an worauf du hinaus willst. Direkt auf den b's zu rechnen braucht am wenigsten Speicher, wenn du Laufzeit optimieren willst, wäre es vermutlich am besten einen Array mit den 1/b und -1/b zu erzeugen und damit zu rechnen.


Zitat:
- kann ich aus der Schleife der F-Matrix heraus die b-Matrix überhaubt so ansprechen? Der Gültigkeitsbereich von pBreite[] wurde ja nicht verlassen

Klar, warum auch nicht...


Zitat:
- Ich habe mit i und j Laufvariablen für die Zeilen und Spalten definiert – ich ahne aber das nicht der von mir gewünschte Effekt, nämlich das Ansprechen der gleichen Zeilen- bzw. Spaltennummer erreicht wird, sondern die jeweilige Anzahl der Zeilen/Spalten.

Die Schleife sieht ganz okay aus...

Ansonsten:
- was ist Fss?
- Vergleichsoperator ist == nicht =. Letzteres bewirkt immer eine Zuweisung.


Für Hinweise/Anregungen//Lösungs-)Vorschläge wäre ich überaus dankbar

Arno[/quote]
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.07.2008, 13:34 Uhr
Arno



Die Schleife hat bzw. hatte das Problem, dass sie mit den Ausdrücken


C++:
pMat[i][j] = 1/pBreite[i];



und


C++:
pMat[i][j] = -1/pBreite[i];



nicht zurecht gekommen ist, da pBreite vom Typ double* ist.

Ich habe daher die Schleife zum Einlesen der Werte von b geändert, so dass sie jetzt so aussieht:


C++:
// Eindimensionales Feld anlegen und einlesen der Breiten b
      
        pBreite = new double[bz];
        for (int i=0;i<bz;i++)
        {
            cout<<"Eingabe der Breite b von Scheibe "<<i+1<<": ";
            cin>>*(pBreite+i);
        }



Nun erhalte ich beim debuggen keine Fehlermeldungen mehr, allerdings schmiert das Programm nach der Eingabe der Werte von b und u mit dem Hinweis auf eine Zugriffsverletzung ab...

Fss steht für die Spaltenanzahl der Matrix Fs

Trotzdem vielen dank für deine Hilfe bislang kronos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: