Quantcast

[Users-fr] Somme d'un vecteur et d'une matrice

classic Classic list List threaded Threaded
6 messages Options
Vincent Flutet Vincent Flutet
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[Users-fr] Somme d'un vecteur et d'une matrice

Bonjour,

Je souhaiterai faire la somme d'un vecteur V de taille 1 x m et d'une matrice M de taille n x m.
C'est évidemment impossible. C'est pourquoi je voudrais transformer le vecteur V en une matrice de taille n x m dont chaque ligne soit identique au vecteur V.
Existe-t-il un moyen simple de le faire.

Merci
Vincent
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
jbaudais jbaudais
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Somme d'un vecteur et d'une matrice

Bonjour,

Le 13/04/2017 à 11:14, Vincent Flutet a écrit :
> [...] un vecteur V de taille 1 x m [...] transformer le vecteur V en une matrice de taille n x m dont chaque ligne soit identique au vecteur V.


scilab> ones(n,1)*V

Jean-Yves
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Rafael Guerra Rafael Guerra
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [Users-fr] Somme d'un vecteur et d'une matrice

In reply to this post by Vincent Flutet
Bonjour,

Vous pourriez essayer repmat:

m=3;
n=5;
V=cumsum(ones(1,m));
M=rand(n,m);
A=repmat(V,n,1)+M

Cdlt,
Rafael
Antoine ELIAS-2 Antoine ELIAS-2
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Somme d'un vecteur et d'une matrice

In reply to this post by Vincent Flutet
Bonjour,

Cela me semble possible en passant par un produit de Kronecker.

V = [1 2 3 4];
M = [1 2 3 4;5 6 7 8;9 10 11 12];
c = V .*. ones(size(M, "r"), 1)
M + c

Cordialement,
Antoine

Le 2017-04-13 11:14, Vincent Flutet a écrit :

> Bonjour,
>
> Je souhaiterai faire la somme d'un vecteur V de taille 1 x m et d'une
> matrice M de taille n x m.
> C'est évidemment impossible. C'est pourquoi je voudrais transformer le
> vecteur V en une matrice de taille n x m dont chaque ligne soit
> identique au vecteur V.
> Existe-t-il un moyen simple de le faire.
>
> Merci
> Vincent
> _______________________________________________
> users-fr mailing list
> [hidden email]
> http://lists.scilab.org/mailman/listinfo/users-fr
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
jbaudais jbaudais
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Somme d'un vecteur et d'une matrice

Bonjour,

Le 13/04/2017 à 11:36, [hidden email] a écrit :
> Cela me semble possible en passant par un produit de Kronecker [...]

Par curiosité j'ai testé la rapidité les trois solutions proposées

iter=100;
out=zeros(3,iter);
for i=1:iter
   mprintf("\r%d  ",i)
   n=2e3;V=rand(1,n);
   timer();ones(n,1)*V;tmp=timer();
   out(1,i)=tmp;
   timer();repmat(V,n,1);tmp=timer();
   out(2,i)=tmp;
   timer();V.*.ones(n,1);tmp=timer();
   out(3,i)=tmp;
end
mean(out,'c')

et sur ma machine le résultat est

ans  =
0.04524
0.12252
0.03076

   Moralité : le produit de Kroneker est en moyenne un peu plus rapide
que le produit vectoriel. Quand à la fonction repmat, ce n'est pas une
bonne solution. Bien évidement, tout ça n'est vrai que dans le cas
traité ici.

Jean-Yves
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Rafael Guerra Rafael Guerra
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Somme d'un vecteur et d'une matrice

Un quatrième concurrent dans la course est V(ones(1,n),:) et il semble arriver en deuxième position:

iter=100;
n=1.5e3;
out=zeros(4,iter);
for i=1:iter
   mprintf("\r%d  ",i)
   V=rand(1,n);
   timer();ones(n,1)*V;
   out(1,i)=timer();
   timer();repmat(V,n,1);
   out(2,i)=timer();
   timer();V.*.ones(n,1);
   out(3,i)=timer();
   timer();V(ones(1,n),:);
   out(4,i)=timer();
end
printf("\n")
for i=1:4
    printf("method#%i: %.2f (ms)\n",i, 1e3*mean(out(i,:)))
end

-->
   method#1: 40.09 (ms)
   method#2: 82.21 (ms)
   method#3: 16.69 (ms)
   method#4: 27.30 (ms)


Cdlt,
Rafae
Loading...