Partage
  • Partager sur Facebook
  • Partager sur Twitter

Produit d'une matrice et d'un vecteur

4 octobre 2016 à 21:00:43

Bonjour j'éssaie de crée une fonction qui calcul le produit d'une matrice par un vecteur et qui donc nous retourne un vecteur. Voila où j'en suis:

#include <stdio.h>
#include <math.h> 

int pmat(int *matrice, int vecteur[], int n){
	int C[n];
	int i, j;
	for(i=0 ; i<n ; i++){
		C[i]=0;
	}
	for(i=0 ; i<n ; i++){
		for(j=0 ; j<n ; j++){
			C[i] = C[i] + (matrice[i][j])*(vecteur[j]);
		}
	}
	return *C;
}

int main(){
	int A[3][3];
	int V[3];
	int B[3];

	A[0][0]=2;
	A[0][1]=2;
	A[0][2]=2;

	A[1][0]=3;
	A[1][1]=3;
	A[1][2]=3;

	A[2][0]=4;
	A[2][1]=4;
	A[2][2]=4;

	V[0]=2;
	V[1]=2;
	V[2]=2;

	int C[3];
	*B = pmat(A,V,3);
	return 0;
}

Clairement, je sais que ça va surement arracher les yeux de certains, mais soyez compréhensif, je n'ai pas eu de cours de programmation depuis 2 ans.

J'ai un problème de pointeur/tableau:

- Déjà quand je déclare les variables de ma fonction, comment je fais appel à une matrice.

- Ensuite, je voudrais que mon vecteur B dans mon "main" prenne les valeurs de C dans ma fonction. Est ce que c'est la bonne façon ?

Merci de vos réponses !

  • Partager sur Facebook
  • Partager sur Twitter
4 octobre 2016 à 21:26:22

Bonsoir,

pour passer un tableau de 2 dimensions dans une fonction, par exemple:

int array[N_ligne][N_colonne];
f(array);

la fonction f doit etre déclaré soit

TYPE f(int array[][N_colonne]) // TYPE dépends de ce que tu retournes int, double, ...
{
    ...
}

soit

TYPE f(int (*array)[N_colonne])
{
  ...
}

donc il faut modifier ta fonction pmat.

Une fois ces modification effectué, la fonction pmat (avec ton return *C) retourne la première valeur du vecteur C soit C[0]

Pour avoir le vecteur complet, il faudrait passer ton vecteur B, par référence. La définition de la fonction devient:

void pmat(int resultat[], int matrice[][3], int vecteur[], int n);

 après à toi d'effectuer les modifications nécessaire dans la fonction pmat

-
Edité par cauld 4 octobre 2016 à 21:30:06

  • Partager sur Facebook
  • Partager sur Twitter
4 octobre 2016 à 22:53:25

J'ai plus ou moins compris ce que tu m'a expliqué par rapport au "type" que je dois crée. Mais j'ai modifié mon programme avec ce que tu m'a dis en dernier et cela fonctionne:

#include <stdio.h>
#include <math.h> 

void pmat(int resultat[], int matrice[][3], int vecteur[], int n){
	int i, j;
	for(i=0 ; i<n ; i++){
		resultat[i]=0;
	}
	for(i=0 ; i<n ; i++){
		for(j=0 ; j<n ; j++){
			resultat[i] = resultat[i] + (matrice[i][j])*(vecteur[j]);
		}
	}
}

int main(){
	int A[3][3];
	int V[3];
	int B[3];
	int i;

	A[0][0]=2;
	A[0][1]=2;
	A[0][2]=2;

	A[1][0]=3;
	A[1][1]=3;
	A[1][2]=3;

	A[2][0]=4;
	A[2][1]=4;
	A[2][2]=4;

	V[0]=2;
	V[1]=2;
	V[2]=2;

	int C[3];
	pmat(B,A,V,3);

	printf("\n");
	for(i=0 ; i<3 ; i++){
		printf("%d ",B[i]);
		printf("\n");
	}
	return 0;
}

Donc ça marche, mais si je n'ai pas une matrice 3*3, je dois changé les valeurs directement dans le programme. Donc c'est pas très pratique, mais ça fonctionne. 
Qu'est ce que je dois mettre dans les pointillés ?

Merci bien pour l'aide.

  • Partager sur Facebook
  • Partager sur Twitter
4 octobre 2016 à 23:07:43

les pointillés représentent du code à insérer.

Effectivement, ça ne fonction que pour une taille fixe. Une alternative serait de transformer la matrice (un tableau à 2 dimensions) en un tableau à 1 dimension.

Pour une matrice à N lignes et P colonnes, l'index du tableau à 1 dimension devient j + N * i

matrice[i][j] <=> tableau[j + N * i]

à moins qu'il y a une autre solution, mais là je flanche

EDIT: une autre façon bien compliqué (pour ceux qui ne sont pas à l'aise avec les pointeurs!) est de définir la matrice en pointeur de pointeur de int: int **matrice puis des allocations dynamique avec malloc, etc

Sinon quelques remarques sur ton code actuel. Pour initialiser ta matrice tu peux écrire:

int A[3][3] = { {2, 2, 2},
                {3, 3, 3},
                {4, 4, 4} };

de même pour le vecteur:

int V[3] = {2, 2, 2};

-
Edité par cauld 4 octobre 2016 à 23:35:48

  • Partager sur Facebook
  • Partager sur Twitter
5 octobre 2016 à 18:58:50

Ok merci pour l'aide, je vais voir cela,
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2019 à 19:03:08

Salut , vous pouvez me donner une idée comment programmer cette fonction χ 2 . J'ai un début de programme en c++:
 least-square minimization of the function:  
Image en ligne
Image en ligne    sont les Data8TeV_185.h  , et  Image en ligne   sont  les ThDataCT10nlo_185.h  les éléments  de la matrice Image en lignesont stcorr2.h et   pdfunc_185.h
Le programme en C++:

#definenAs16
#definenalphas1112
#definenAllBins185
#definenybins6
//-- bins index              
constintpTbins[nybins]={37,37,36,32,25,18};
constintpTbs0[nybins] ={0,37,74,110,142,167},pTbs1[nybins]={36,73,109,141,166,184} ;
constint  nAllBins_min =pTbs0[0];  //0-36, 37-73, 74-109, 110-141, 142-166, 167-184
constint  nAllBins_max =pTbs1[5];
doubletAlphas[nAs];
//--------------------------- theoretical and experimental Data --------
#include"Data8TeV_185.h"// experiment: CMS 8 TeV data 
#include"stcorr2.h"// stat. correlations
#include"ThDataCT10nlo_185.h"// theory: Fnlo-nlojet++  CT10
#include"pdfunc_185.h"// pdf Unc. in %

//---------------------------------------------------------------------
intmain(intargcchar** argv){
// available alphas CT10
for(int i=0;i<nAs;i++){tAlphas[i]=0.001*(i+nalphas1);}


return0;
}
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2019 à 19:18:06

Tu as tout faux !

1) Remonter un vieux sujet !

2) Squatter un sujet !

3) Non utilisation du bouton code </> du forum pour poster ton code !

4) Message illisible !

  • Partager sur Facebook
  • Partager sur Twitter
12 octobre 2019 à 9:48:50

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter