Page 1 of 2

supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:01
by alexprime100
bonjour, je suis en train de créer un programme, et depuis tout à l'heure, je chercher une commande qui permet de supprimer une ligne d'une matrice, mais je n'en trouve pas, alors pouvez-vous me dire s'il existe une commande pour supprimer une ligne svp ?

Re: supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:04
by Epharius
Y'a plusieurs solutions, mais aucune n'est simple à proprement parler. À mes souvenirs en tout cas, il n'existe pas de fonction pour supprimer une ligne ou une colonne.
Ma solution serait alors de tout décaler, avec une boucle For(A,LigneASupprimer,FinDeLaMatrice-1) en faisant [A](A+1,1)->[A](A,1) etc...
Il existe surement plein d'autres façon de le faire par contre ;)

Re: supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:10
by alexprime100
mais si j'applique cette boucle sur une matrice n*m, est ce que ça devient une matrice (n-1)*m ?

Re: supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:11
by Epharius
Non, ça déplace juste les éléments si la ligne à supprimer n'est pas à la fin. Il faut ensuite enlever 1 à la dimension de la matrice, mais sur nspire je ne sais pas comment faire...

Re: supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:13
by Hayleia
Sinon, une bonne vieille multiplication matricielle ;)
Code: Select all
1 0 0 0   a b c d   a b c d
0 0 1 0 * e f g h = i j k l
0 0 0 1   i j k l   m n o p
          m n o p

Re: supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:41
by alexprime100
finalement j'ai réussi à trouver une solution, j'ai créé une nouvelle matrice plus petite dans laquelle j'ai copié les éléments à garder avec une boucle.

Re: supprimer une ligne d'une matrice

Unread postPosted: 25 Oct 2015, 19:46
by Hamza.S
pourrais-tu mettre ton code?

Re: supprimer une ligne d'une matrice

Unread postPosted: 26 Oct 2015, 15:35
by Bisam
On peut le faire aussi en utilisant les fonctions submat et augment

Re: supprimer une ligne d'une matrice

Unread postPosted: 07 Nov 2015, 13:46
by alphaméthyste
Hayleia wrote:Sinon, une bonne vieille multiplication matricielle ;)
Code: Select all
1 0 0 0   a b c d   a b c d
0 0 1 0 * e f g h = i j k l
0 0 0 1   i j k l   m n o p
          m n o p


très bonne idée ! Merci Hayleia

j'utilise ta méthode dans le code ci-dessous d'une fonction dénommée supp(i,j,x)

où x est une np-matrice à composantes réelles (pour des composante complexe il faut legerement modifier le code mais c'est facile il suffit de remplacer x^T par conj(x^T)

bon alors il s'agit de supprimer la i ème ligne et la j ième colonne d'une matrice à composante réelles

lorsque i=0 aucune ligne est supprimée et lorsque j=0 aucune colonne est supprimée

cette fonction utilise une autre fonction : le code de ces deux fonctions sont donnés ici
Code: Select all
Define supp(i,j,x)=
Func
Local ligne1,ligne2,var,var0,var1,var2,var3,u,id,v,y,z,nul,k
var3:=0
var2:=1
y:=x
v:=y
ligne1:=1
ligne2:=2
If i ≠ 0 Then
k:=i
Goto ligne1
EndIf
If j=0 Then
Goto ligne2
EndIf
k:=j
v:= y^T
var3:=1
Goto ligne1
Lbl ligne1
var:=dim(v)
var1:=var[1]
var0:=var1-1
nul:=newMat(var0,1)
id:=canon(var0)
var:=0
While var<var1
var:=var+1
If var = 1 and var=k Then
u:=nul
EndIf
If var ≠ 1 and var=k Then
u:=augment(u,nul)
EndIf
If var = 1 and var ≠ k Then
u:=(id^T[var2])^T
var2:=var2+1
EndIf
If var ≠ 1 and var ≠ k Then
u:=augment(u,(id^T[var2])^T)
var2:=var2+1 
EndIf
EndWhile
If var3=0 Then
y:=u.y
k:=j
v:=y^T
var2:=1
EndIf
If var3=1 Then
y:=y.u^T
EndIf
var3:=var3+1
If var3=2 Then
Goto ligne2
EndIf
If j=0 Then
Goto ligne2
EndIf
Goto ligne1
Lbl ligne2
z:=y
Return z
EndFunc


et ci-dessous la fonction canon(n)

Code: Select all
Define canon(n)=
Func
Local var,id
id:=newMat(n,n)
var:=1
While var ≤ n
id[var,var]:=1
var:=var+1
EndWhile
Return id
Endfunc

Re: supprimer une ligne d'une matrice

Unread postPosted: 07 Nov 2015, 16:01
by Bisam
@alphaméthyste : Ta fonction canon(n) ne sert à rien : elle existe déjà sur la calculette. C'est identity(n).

@alexprime100 :
finalement j'ai réussi à trouver une solution, j'ai créé une nouvelle matrice plus petite dans laquelle j'ai copié les éléments à garder avec une boucle.

C'est sans doute la méthode la plus performante.
Voici un code qui le fait :
Code: Select all
Define supp(i,j,x)=
Func
Local rep,ligne,n,p,k,l
n:=rowdim(x)
p:=coldim(x)
rep := {}
For k,1,n
  If k ≠ i Then
    ligne := {}
    For l,1,p
      If l ≠ j
        ligne := augment(ligne, {x[k,l]})
    EndFor
    If rep = {} Then
      rep := {ligne}
    Else
      rep := augment(rep, {ligne})
    EndIf
  EndIf
EndFor
Return rep
EndFunc