Προς το περιεχόμενο

απορια σε C


maria_smile

Προτεινόμενες αναρτήσεις

Γεια σας!

λοιπον..να σας ρωτησω..

θελω να γραψω την εξης πραξη στην C και κολλησα ολιγον τι...γι αυτο βοηθειααααααα

η πραξη ειναι:

[α β ; γ δ]*Α=[αΑ βΑ; γΑ δΑ]

 

( το * δεν ειναι ο κλασσικος πολλαπλασιασμος, αλλα η πραξη οπως οριζεται απο πανω)

ο Α ειναι επισης πινακας διαστασης n*n

 

Οποιος εχει καμια ιδεα για να ξεμπλοκαρω ας βοηθησει...

ευχαριστω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δέν καταλαβαίνω τι ακριβώς θες να κάνεις. Άμα αναλύσεις λίγο παραπάνω ίσσως μπορώ να βοηθήσω. Ισσως να βοηθούσε τι αν μας έλεγες τι ακιβώς θες να κάνεις μήπως πάς να το πλησιάσεις με λάθος τρόπο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Ναι όντως φαίνεται και περίεργο αυτό που θέλεις να κάνεις.

Σε ενδιαφέρει να "πολ/σεις-σύμφωνα-με-αυτή-την-πράξη" ένα πίνακα διαστάσεων k*l με ένα πίνακα A διαστάσεων n*n και να πάρεις ένα πίνακα διαστάσεων kn*ln ; (ή ένα 2*2 με ένα πίνακα A διαστάσεων n*n και να πάρεις ένα πίνακα διαστάσεων 2n*2n; )

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θελω να πολλαπλασιασω (αλλα δεν ειναι ακριβως πολλαπλασιασμος πινακων. Ειναι πολλαπλασιασμος συμφωνα με την πραξη που περιγραφω) εναν πινακα 2*2 με εναν πινακα n*n και να παρω εναν πινακα 2n*2n.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λίγο άκυρο να γίνει αυτό που λες μιας και για να πολλαπλασιάσεις δύο πίνακες όπου στην περίπτωση σου ο ένας είναι 2 * 2 και ο άλλος n * n πρέπει να το n να είναι υποχρεωτικά 2 γιατί το αποτελέσμα του γινομένου 2 πινάκων είναι ένας νέος πίνακας με γραμμές τον αριθμό των γραμμών του πρώτου και στήλες τον αριθμό των στηλών του δεύτερου, εφόσον όμως ο αριθμός των στηλών του πρώτου είναι ίσος με τον αριθμό των γραμμών του δεύτερου.Άρα δύσκολο να μοντελοποιήσουμε αλγεβρικά κάτι τέτοιο, μάλλον άκυρο μιας και δεν γίνεται. Και στο φινάλε γιατί θέλεις να το κάνεις αυτό;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Κάτι σαν το παρακάτω ;

>
int main(int argc, char** argv)
{
//Αρχικοποιείς τους πινακές σου.
//Υποθέτω ένα σταθερό πίνακα arr1 (2x2) και δύο με malloc που κατανέμουν χώρο ανάλογα με την τιμή του n.
int arr1[2][2];
int *arr2;
int *arr_Result;
int n, dummyCounter;
int i1, j1; // gia loop sta stoixeia tou prwtou pinaka 2x2
int i2, j2; // gia loop sta stoixeia tou 2ou pinaka nxn.
int currentPolsths = 0;

//Arxikopoihsh  metablhths n
n = 4;
//
// Arxikopoihsh pinakwn arr1, arr2 kai arr_Result
//
arr2 = (int *)malloc(n*n*sizeof(int));
arr_Result = (int *)malloc(2*n*2*n*sizeof(int));

// pinakas arr1 estw: [1 2;3 4]
dummyCounter = 0;
for(i1=0; i1<2; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   arr1[i1][j1] = ++dummyCounter;
 }
}
// pinakas arr2 estw: olo assoi.
for(i1=0; i1<n; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   arr2[i1*n + j1] = 1;
 }
}
// Telos arxikopoihshs

// pare KA8E ena apo ta stoixeia tou 2x2 pinaka
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   currentPolsths = arr1[i1][j1];
   // poll/se ton currentPolsths me KA8E ENA apo ta stoixeia tou pinaka arr2
   for(i2 = 0; i2 <n ; i2++)
   {
     for(j2 =0; j2 <n ; j2++)
     {
       // to apotelesma 8a mpei ston teliko pinaka arr_Result
       // sth 8esh i1*n + i2, j1*n + j2
         arr_Result[((i1*n + i2)*2*n) + (j1*n + j2)] = currentPolsths * arr2[i2*n + j2];
     }
   }
 }
}  


printf("Pinakas 1:\n");
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   printf("%d   ", arr1[i1][j1]);    
 }
 printf("\n");
}
printf("Pinakas 2:\n");
for(i1 = 0; i1 <n ; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   printf("%d   ", arr2[i1*n+j1]);
 }
 printf("\n");
}

// ektypwsh twn stoixeiwn tou telikoy pinaka
printf("Telikos pinakas:\n");
for(i1 = 0; i1 <2*n ; i1++)
{
 for(j1 =0; j1 <2*n ; j1++)
 {
   printf("%d   ", arr_Result[i1*2*n + j1]);    
 }
 printf("\n");
}

}

 

edit: ίσως είναι λιιιγο πιο απλό αν τους δύο "δυναμικούς" πίνακες τους αναθέσεις χώρο όχι ως απλά διανύσματα (όπως παραπάνω) αλλά ως εξής:

>
int main(int argc, char** argv)
{
//Αρχικοποιείς τους πινακές σου.
//Υποθέτω ένα σταθερό πίνακα arr1 (2x2) και δύο με malloc που κατανέμουν χώρο ανάλογα με την τιμή του n.
int arr1[2][2];
int **arr2;
int **arr_Result;
int n, dummyCounter;
int i1, j1; // gia loop sta stoixeia tou prwtou pinaka 2x2
int i2, j2; // gia loop sta stoixeia tou 2ou pinaka nxn.
int currentPolsths = 0;

//Arxikopoihsh  metablhths n
n = 4;
//
// Arxikopoihsh pinakwn arr1, arr2 kai arr_Result
//
arr2 = (int **)malloc(n*sizeof(int *));
for(i1=0; i1<n; i1++)
{
arr2[i1] = (int *)malloc(n*sizeof(int));
}

arr_Result = (int **)malloc(2*n*sizeof(int *));
for(i1=0; i1<2*n; i1++)
{
arr_Result[i1] = (int *)malloc(2*n*sizeof(int));
}
// pinakas arr1 estw: [1 2;3 4]
dummyCounter = 0;
for(i1=0; i1<2; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   arr1[i1][j1] = ++dummyCounter;
 }
}
// pinakas arr2 estw: olo assoi.
for(i1=0; i1<n; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   arr2[i1][j1] = 1;
 }
}


// Telos arxikopoihshs

// pare KA8E ena apo ta stoixeia tou 2x2 pinaka
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   currentPolsths = arr1[i1][j1];
   // poll/se ton currentPolsths me KA8E ENA apo ta stoixeia tou pinaka arr2
   for(i2 = 0; i2 <n ; i2++)
   {
     for(j2 =0; j2 <n ; j2++)
     {
       // to apotelesma 8a mpei ston teliko pinaka arr_Result
       // sth 8esh i1*n + i2, j1*n + j2
         arr_Result[i1*n + i2][j1*n + j2] = currentPolsths * arr2[i2][j2];
     }
   }
 }
}  


printf("Pinakas 1:\n");
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   printf("%d   ", arr1[i1][j1]);    
 }
 printf("\n");
}
printf("Pinakas 2:\n");
for(i1 = 0; i1 <n ; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   printf("%d   ", arr2[i1][j1]);
 }
 printf("\n");
}

// ektypwsh twn stoixeiwn tou telikoy pinaka
printf("Telikos pinakas:\n");
for(i1 = 0; i1 <2*n ; i1++)
{
 for(j1 =0; j1 <2*n ; j1++)
 {
   printf("%d   ", arr_Result[i1][j1]);    
 }
 printf("\n");
}


}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λίγο άκυρο να γίνει αυτό που λες μιας και για να πολλαπλασιάσεις δύο πίνακες όπου στην περίπτωση σου ο ένας είναι 2 * 2 και ο άλλος n * n πρέπει να το n να είναι υποχρεωτικά 2 γιατί το αποτελέσμα του γινομένου 2 πινάκων είναι ένας νέος πίνακας με γραμμές τον αριθμό των γραμμών του πρώτου και στήλες τον αριθμό των στηλών του δεύτερου, εφόσον όμως ο αριθμός των στηλών του πρώτου είναι ίσος με τον αριθμό των γραμμών του δεύτερου.Άρα δύσκολο να μοντελοποιήσουμε αλγεβρικά κάτι τέτοιο, μάλλον άκυρο μιας και δεν γίνεται. Και στο φινάλε γιατί θέλεις να το κάνεις αυτό;

 

Μα δεν ειναι ο κλασσικος πολλαπλασιασμος.. Γι αυτο εγραπσα κ την πραξη.

Ουσιαστικα ειναι πολλαπλασιασμος ενοσ πινακα 2*2 με καθενα απτα στοιχεια του Α (οπου ο Α ειναι n*n).

Οποτε γινεται κανονικα ο πολλαπλασιασμος..Αρκει την πρωτη φορα ο Α να ειναι 4* οτιδιποτε..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κάτι σαν το παρακάτω ;

>
int main(int argc, char** argv)
{
//Αρχικοποιείς τους πινακές σου.
//Υποθέτω ένα σταθερό πίνακα arr1 (2x2) και δύο με malloc που κατανέμουν χώρο ανάλογα με την τιμή του n.
int arr1[2][2];
int *arr2;
int *arr_Result;
int n, dummyCounter;
int i1, j1; // gia loop sta stoixeia tou prwtou pinaka 2x2
int i2, j2; // gia loop sta stoixeia tou 2ou pinaka nxn.
int currentPolsths = 0;

//Arxikopoihsh  metablhths n
n = 4;
//
// Arxikopoihsh pinakwn arr1, arr2 kai arr_Result
//
arr2 = (int *)malloc(n*n*sizeof(int));
arr_Result = (int *)malloc(2*n*2*n*sizeof(int));

// pinakas arr1 estw: [1 2;3 4]
dummyCounter = 0;
for(i1=0; i1<2; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   arr1[i1][j1] = ++dummyCounter;
 }
}
// pinakas arr2 estw: olo assoi.
for(i1=0; i1<n; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   arr2[i1*n + j1] = 1;
 }
}
// Telos arxikopoihshs

// pare KA8E ena apo ta stoixeia tou 2x2 pinaka
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   currentPolsths = arr1[i1][j1];
   // poll/se ton currentPolsths me KA8E ENA apo ta stoixeia tou pinaka arr2
   for(i2 = 0; i2 <n ; i2++)
   {
     for(j2 =0; j2 <n ; j2++)
     {
       // to apotelesma 8a mpei ston teliko pinaka arr_Result
       // sth 8esh i1*n + i2, j1*n + j2
         arr_Result[((i1*n + i2)*2*n) + (j1*n + j2)] = currentPolsths * arr2[i2*n + j2];
     }
   }
 }
}  


printf("Pinakas 1:\n");
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   printf("%d   ", arr1[i1][j1]);    
 }
 printf("\n");
}
printf("Pinakas 2:\n");
for(i1 = 0; i1 <n ; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   printf("%d   ", arr2[i1*n+j1]);
 }
 printf("\n");
}

// ektypwsh twn stoixeiwn tou telikoy pinaka
printf("Telikos pinakas:\n");
for(i1 = 0; i1 <2*n ; i1++)
{
 for(j1 =0; j1 <2*n ; j1++)
 {
   printf("%d   ", arr_Result[i1*2*n + j1]);    
 }
 printf("\n");
}

}

 

edit: ίσως είναι λιιιγο πιο απλό αν τους δύο "δυναμικούς" πίνακες τους αναθέσεις χώρο όχι ως απλά διανύσματα (όπως παραπάνω) αλλά ως εξής:

>
int main(int argc, char** argv)
{
//Αρχικοποιείς τους πινακές σου.
//Υποθέτω ένα σταθερό πίνακα arr1 (2x2) και δύο με malloc που κατανέμουν χώρο ανάλογα με την τιμή του n.
int arr1[2][2];
int **arr2;
int **arr_Result;
int n, dummyCounter;
int i1, j1; // gia loop sta stoixeia tou prwtou pinaka 2x2
int i2, j2; // gia loop sta stoixeia tou 2ou pinaka nxn.
int currentPolsths = 0;

//Arxikopoihsh  metablhths n
n = 4;
//
// Arxikopoihsh pinakwn arr1, arr2 kai arr_Result
//
arr2 = (int **)malloc(n*sizeof(int *));
for(i1=0; i1<n; i1++)
{
arr2[i1] = (int *)malloc(n*sizeof(int));
}

arr_Result = (int **)malloc(2*n*sizeof(int *));
for(i1=0; i1<2*n; i1++)
{
arr_Result[i1] = (int *)malloc(2*n*sizeof(int));
}
// pinakas arr1 estw: [1 2;3 4]
dummyCounter = 0;
for(i1=0; i1<2; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   arr1[i1][j1] = ++dummyCounter;
 }
}
// pinakas arr2 estw: olo assoi.
for(i1=0; i1<n; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   arr2[i1][j1] = 1;
 }
}


// Telos arxikopoihshs

// pare KA8E ena apo ta stoixeia tou 2x2 pinaka
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   currentPolsths = arr1[i1][j1];
   // poll/se ton currentPolsths me KA8E ENA apo ta stoixeia tou pinaka arr2
   for(i2 = 0; i2 <n ; i2++)
   {
     for(j2 =0; j2 <n ; j2++)
     {
       // to apotelesma 8a mpei ston teliko pinaka arr_Result
       // sth 8esh i1*n + i2, j1*n + j2
         arr_Result[i1*n + i2][j1*n + j2] = currentPolsths * arr2[i2][j2];
     }
   }
 }
}  


printf("Pinakas 1:\n");
for(i1 = 0; i1 <2 ; i1++)
{
 for(j1 =0; j1 <2 ; j1++)
 {
   printf("%d   ", arr1[i1][j1]);    
 }
 printf("\n");
}
printf("Pinakas 2:\n");
for(i1 = 0; i1 <n ; i1++)
{
 for(j1 =0; j1 <n ; j1++)
 {
   printf("%d   ", arr2[i1][j1]);
 }
 printf("\n");
}

// ektypwsh twn stoixeiwn tou telikoy pinaka
printf("Telikos pinakas:\n");
for(i1 = 0; i1 <2*n ; i1++)
{
 for(j1 =0; j1 <2*n ; j1++)
 {
   printf("%d   ", arr_Result[i1][j1]);    
 }
 printf("\n");
}


}

 

 

Ενταξει μου φαινεται αυτο...

Σ' ευχαρισιτω πολυ!!

Καλο σαβατοκυριακο

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γεια σας!

λοιπον..να σας ρωτησω..

θελω να γραψω την εξης πραξη στην C και κολλησα ολιγον τι...γι αυτο βοηθειααααααα

η πραξη ειναι:

[α β ; γ δ]*Α=[αΑ βΑ; γΑ δΑ]

 

( το * δεν ειναι ο κλασσικος πολλαπλασιασμος, αλλα η πραξη οπως οριζεται απο πανω)

ο Α ειναι επισης πινακας διαστασης n*n

 

Οποιος εχει καμια ιδεα για να ξεμπλοκαρω ας βοηθησει...

ευχαριστω

 

Αυτή η "ειδική πράξη" λέγεται πολλαπλασιασμός Kronecker και αν το ψάξεις όλο και κάτι θα βρεις στο web.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γεια και παλι!

Τωρα θέλω εφαρμοζοντας αυτην την πραξη να κανω:

V(n)=[1 0; -1 1]* V(n-1) για n>=1 (αναδρομικος τυπος)

Εκανα το παρακατω,αλλα δεν δουλευει. Αν καποιος μπορει να βοηθησει....

Ευχαριστω!!!

Vn.txt

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καταρχην, δεν επιστρεφει κατι η συναρτηση σου....

 

επιπλεον, εισαι σιγουρη πως ο αλγοριθμος ειναι σωστος? Τον εβγαλες εσυ ή το βρηκες καπου?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ξέρω τι προσπαθείς να κάνεις (από μαθηματικά τα τυπικά μόνο :P) , απλά ως έχει η συνάρτηση σπάει με access violation στην γραμμή, οπότε πρόσεξε τους πίνακες σου:

 

>
Vn[i*k+in][j*k+jn]=t*Vn[in][jn];

 

Καλή συνέχεια.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να στε καλα....

να ρωτησω κατι ακομα,γιατι κανω διαφορες δοκιμες...

πως γινεται να γραψω στη C εναν πινακα;

Δεν ισχυει το ιδιο που χουμε στη Matlab; Αν γραψω δηλαδη Α=[1 2 ; 3 4 ] θα μου δωσει τον πινακα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...