Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Matrix potenzieren

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 ] > 2 < [ 3 ]
010
02.07.2003, 17:51 Uhr
~daredevil
Gast


was ist an dem falsch?

C++:
#include <stdio.h>

void matrix_pow(double *m, int n, int x);

int main(){
int i,j,n=3;
double *matrix=new double[n*n];

matrix[0]=1;
matrix[1]=2;
matrix[2]=-2;

matrix[3]=1;
matrix[4]=2;
matrix[5]=1;

matrix[6]=-1;
matrix[7]=3;
matrix[8]=1;

matrix_pow(matrix,n,3);
for(j=0;j<n;j++){
    for(i=0;i<n;i++)
        printf("%0.2f\t",matrix[i+j*n]);
    printf("\n");
}
}

void matrix_pow(double *m,int n,int x)
{
int i,j, k;
double *mat=new double[n*n];

for(i=0; i<(n*n); i++)
    mat[i]=0;


for(; x>1; x--)
{
    for(i=0; i<(n*n); i++)
    {
    for(k=0, j=0;j<n; k+=n, j++)
    {
    mat[n*i+j]+=m[n*i+j]*m[i+k];
    }
    k=0;
    }

}

for(i=0; i<(n*n); i++)
m[i]=mat[i];

}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
02.07.2003, 18:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zum einen funktioniert deine innere Schleife nicht richtig

C++:
for(k=0, j=0;j<n; k+=n, j++){
mat[n*i+j]+=m[n*i+j]*m[i+k];
}



und wenn sie es tuen würde hättest du noch nen kleinen denkfehler drin.
Du kannst nicht einfach immer stupide draufsummiern, das würde nur bei n=2 klappen.
Du muss schon noch speicher opfern um dir die alte matrix und die neu errechnete matrix zu merken und dann die neue immer mit der alten multiplizieren.
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
02.07.2003, 18:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ist aber schon nahe dran
versuch mal erst mal mit quadrieren also matrix_pow(matrix,n,2);

dann muss folgendes rauskommen

5 0 -2
2 9 1
1 7 6


wenn das geht kannst du ja auf die höheren potenzen umsteigen, dann wird dir das auch bestimmt mit dem zusätzlichen speicher den du benötigst klarer

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
03.07.2003, 12:46 Uhr
~daredevil
Gast


Juhuuu!!!!

es funktioniert!!!


C++:
#include <stdio.h>
#include <iostream.h>

void matrix_pow(double *m, int n, int x);

int main(){
int i,j,n=3;
double *matrix=new double[n*n];

matrix[0]=1;
matrix[1]=2;
matrix[2]=-2;

matrix[3]=1;
matrix[4]=2;
matrix[5]=1;

matrix[6]=-1;
matrix[7]=3;
matrix[8]=1;

matrix_pow(matrix,n,3);
for(j=0;j<n;j++){
    for(i=0;i<n;i++)
        printf("%0.2f\t",matrix[i+j*n]);
    printf("\n");
}
}

void matrix_pow(double *m,int n,int x)
{
int i,j, k,f, d, v;
double *mat=new double[n*n];
double *sum=new double[n*n];

for(i=0; i<(n*n); i++)
{mat[i]=m[i];
sum[i]=0;}

for(; x>1; x--)
{
    for(i=0, v=0, f=0, d=0; i<(n*n); i++)
    {
    for(k=0, j=0;j<n; k+=n, j++)
    {
    sum[d]+=mat[n*v+j]*m[f+k];
    }
    f++;
    if(f==n)
    {
    v++; f=0;
    }
    d++;
    k=0;

    }

for(i=0; i<(n*n); i++)
    mat[i]=sum[i];


for(i=0; i<(n*n); i++)
    sum[i]=0;

}


for(i=0; i<(n*n); i++)
m[i]=mat[i];
}




Und wehe es sagt einer, das kann man noch optimieren
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
03.07.2003, 12:57 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


sieht ganz gut aus, mal davon abgesehen das du den allokierten speicher nicht wieder frei gibst.
War ne ganz gute Idee das innerhalb einer schleife laufen zu lassen.
Ich habe zwei dafür gebraucht.
Trotzdem ist meins kürzer


C++:
void matrix_pow(double*m,int n,int x){
double *a;
int i,j,k,c=n*n;

    a=new double[2*c];
    for(i=0;i<2*c;i++)a[i]=m[i%c];
    while(--x){
        for(j=0;j<n;j++)
            for(i=0;i<n;i++){
                m[i+j*n]=0;
                for(k=0;k<n;k++)
                    m[i+j*n]+=a[k+j*n]*a[c+k*n+i];
            }
        for(i=0;i<c;i++)a[i]=m[i];
    }
    delete[]a;
}



Gruss Heiko

Ach so als Matrixspezialst darfst du dich absofort Neo nennen oder was sagen die anderen dazu?

dies Rästel ist übrigens noch offen
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 03.07.2003 um 13:05 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
03.07.2003, 13:23 Uhr
~daredevil
Gast


ja heiko, du hast mich sozusagen erst mal eingearbeitet in matrizen, damit es mir wieder einfiel wies ging.

weil du meintest, dass deines kürzer ist, naja, ich war nie der meister der opimierung

woah des wär cool, wenn ich auch son Namen wie du kriegen würde mit virtuno....keine ahnung wie des geschrieben wird.

wie darf ich mich denn nennen, meinen nick möcht ich behalten, kann mich auch registrieren
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
03.07.2003, 13:26 Uhr
~0xdeadbeef
Gast


Wegen des Datentyps nochmal - ich denke, dass ein double** da schon angebracht ist. Ich finde diese feld[i+j*n] Dinger mehr als unübersichtlich. Außerdem optimiert es die Performance bei Rechnungen, die Zeilenaustäusche erfordern - Matrizen invertieren zum Beispiel. Sowas wie

C++:
matrix m;
//...bla, bla. m sei eine Matrix mit sinnvollen Werten drin

m[1][2] = 3; //Wert zuweisen
double *tmp = m[1];
m[1] = m[2];
m[2] = tmp; //Zeilen austauschen


kriegst du mit nem double* nicht hin.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
03.07.2003, 13:59 Uhr
daredevil
Speicherteufel


@heiko: wie wärs mit
daredevil
-der Vernichter der Matrix-

oder so...

naja, bin mal wieder zu überschwänglich. freu mich halt dass das programm läuft, nicht übelnehmen.
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
03.07.2003, 18:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
ich glaub das mit den indices-rechnungen ist kein performance-problem. Das optimiert mein kompiler so weit ich weiss weg.

übringens die macke mit den eindimesionalen feldern habe ich von der bildverabteitung. Alle Api's die ich da verwendet habe wollten immer 1D-Arrays.
Da habe ich mir das irgendwie so angewöhnt und als gut befunden, besonders die tatsache das man beim speicherfreigeben nur ein delete aufrufen muss

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 03.07.2003 um 18:12 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
05.01.2004, 18:26 Uhr
wuz



Hallo ihr!

Ich brauche für java eine methode um matrizen zu potenzieren, disebzüglicher thread ist eh bereits im java forum.
Jetzt wollte ich euch nur direkt fragen ob


Code:
while(--x){



in c soviel wie in java

Code:
while (x>0){
...
x--;
}


bedeutet

thx!

Dieser Post wurde am 05.01.2004 um 18:32 Uhr von wuz editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ Rätselecke ]  


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: