Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/06/2011, 21h18   #1
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Par défaut Construire une matrice a partir d'un vecteur

Bonsoir,

Je veux en effet construire une matrice a partir d'un vecteur dans SAS.


J'ai les donnees suivantes:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DATA vecteur;
input u;
datalines;
1
2
3
10
2
0
3
2
3
6
11
5
;
/*12 elemets*/
run;
A partir de ca je veux construire une matrice 3X4 ou 2x6
Pour la premiere je veux aller jusqu'au 4eme individu du "vecteur" u et ensuite passer a la ligne suivante etc de maniere a obtenir une matrice 3X4 a la fin.Je cherche aussi une methode generale cad a partir de n'importe quel vecteur colonne construire une matrice dont j'ai le choix de la taille.Voila,merci pour vos reponses(pas d'IML bien evidemment)
pevecipierdut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 07h35   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
Je ne saisis pas forcément l'intérêt de ta démarche, car SAS n'est pas très fort avec les matrices, sauf dans IML que tu ne souhaites/veux/peux pas utiliser.
Il faut faire des MERGE de bouts de ton vecteur pour les placer côte à côte, autant de fois que tu as des colonnes dans ta matrice.
Voilà l'idée en macro.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
%MACRO enMatrice (vecteur, nbLignes, nbColonnes, matrice) ;
  DATA &matrice ;
    MERGE
	  %DO i=1 %TO &nbColonnes ;
	    %LET deb = %EVAL((&i - 1) * &nbLignes + 1);
		%LET fin = %EVAL(&deb + &nbLignes - 1) ;
		&vecteur (RENAME=(u=col&i) FIRSTOBS=&deb OBS=&fin)
	  %END ;
	;
  RUN ;
%MEND enMatrice ;
%enMatrice (work.vecteur, 6, 2, work.mat6x2) ;
%enMatrice (work.vecteur, 4, 3, work.mat4x3) ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 16h05   #3
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Merci Olivier pour ta réponse,ça marche nickel,il me manque juste un dernier élément pour trouver ce que je veux...faire la somme de deux matrices carrées...ou bien la somme d'une matrice normale et une matrice diagonale simple...quelqu'un pourrait m'aider?
pevecipierdut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 16h23   #4
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
si tu tapes
PROC SETINIT;RUN;

vois-tu mentionner "IML" ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 17h08   #5
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Toujours sans utiliser IML parce que je n'ai pas IML au boulot...
pevecipierdut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 20h51   #6
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
ah. Joker alors
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 07h04   #7
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Je comprends bien que ton problème initial est spécifié sous forme de matrices. Mais comme débattu plus haut, hors d'IML, ce n'est vraiment pas la forme de données favorite de SAS.
Je commence donc par une autre solution pour transformer un vecteur en matrice.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DATA vecteur;
input u;
datalines;
1
2
3
10
2
0
3
2
3
6
11
5
;
/*12 elemets*/
run;
DATA work.matrice ;
  SET work.vecteur ;
  nCol = 3 ;
  l = FLOOR((_N_-1)/nCol) + 1 ;
  c = MOD(_N_,nCol)+1 ;
RUN ;
PROC SORT DATA=work.matrice ;
  BY l c ;
RUN ;
PROC TRANSPOSE DATA=work.matrice
				OUT=work.matrice
				(DROP=_name_ l) ;
  BY l ;
  VAR u ;
  ID c ;
RUN ;
La forme intermédiaire, un vecteur avec numéro de ligne et de colonne dans la matrice, est probablement plus intéressante pour ton addition que la forme réellement matricielle finale.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
DATA vecteur3x3;
input u;
datalines;
1
2
3
10
2
0
3
2
3
;
run;
DATA work.diag3x3 ;
  DO l=1 TO 3 ;
    c=l ;
	d=15 ;
	OUTPUT ;
  END ;
RUN ;
DATA work.matrice ;
  SET work.vecteur3x3 ;
  nCol = 3 ;
  l = FLOOR((_N_-1)/nCol) + 1 ;
  c = MOD(_N_,nCol)+1 ;
RUN ;
PROC SORT DATA=work.matrice ;
  BY l c ;
RUN ;
DATA work.addition ;
  MERGE work.matrice
        work.diag3x3 ;
  BY l c ;
  s = SUM(u,d) ;
RUN ;
PROC TRANSPOSE DATA=work.addition
				OUT=work.addition
				(DROP=_name_ l) ;
  BY l ;
  VAR s ;
  ID c ;
RUN ;
Par contre si tu as aussi besoin d'opérations typiquement matricielles comme diagonalisation, inversion, etc. ça va être plus coton (il faudrait réécrire des algorithmes comme les pivots de Gauss-Jordan et de mémoire, c'était pas super funky).
Une idée en passant si tu as SAS 9.2 : il y a des fonctions matricielles qui peuvent être appelées hors IML dans la proc FCMP. A toi de creuser si tu t'en sens le courage !
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h04.


 
 
 
 
Partenaires

Hébergement Web