2011-11-18 2 views
1

Supposons que j'ai une matrice telle que chaque ligne est un vecteur de base standard, à savoir chaque rangée contient exactement un 1, les autres colonnes étant 0.octave: représentant des matrices de vecteurs de base standards

Y at-il un moyen pratique de créer une telle matrice (c'est-à-dire donné un vecteur de positions de celles où se trouvent les rangées dans chaque rangée)?

De même, y a-t-il une façon dont je devrais représenter une telle matrice afin que les multiplications avec elle puissent être faites plus efficacement en octave?

Répondre

2

Supposons que vous voulez une matrice 3x3 avec celles des colonnes 3, 1 et 2 respectivement:

> pos = [3,1,2]; 
> x = eye(3)(pos,:); 

vous donnera une matrice avec 9 éléments, plus zéro, avec ceux dans les endroits souhaités. Vous pouvez économiser de la mémoire en utilisant une représentation clairsemée: sparse_x = sparse(x);. Mais le test suivant sur ma machine implique que la forme naturelle se multiplie plus rapidement:

> N = 10000; 
> s = rand(N,N); 
> x = eye(N)(randperm(N),:); 
> sx = sparse(x); 
> t = cputime(); ss = s*x; cputime()-t 
ans = 0.41124 
> t = cputime(); ss2 = s*sx; cputime()-t 
ans = 1.0313 

C'était Octave 3.4 sur un processeur Core i7, YMMV.

En regardant whos il semble que Octave est en train de faire quelque chose d'intelligent avec x:

> whos 
Variables in the current scope: 

    Attr Name  Size      Bytes Class 
    ==== ====  ====      ===== ===== 
     N   1x1       8 double 
     s  10000x10000    800000000 double 
     ss  10000x10000    800000000 double 
     ss2  10000x10000    800000000 double 
     sx  10000x10000     160004 double 
     x  10000x10000     40000 double <---SMALLER THAN s! 

Si elle sait x est spécial, peut-être qu'il est déjà parti de prendre speedups dans la multiplication.

+0

Ceci est intéressant. Le stockage de 'x' est seulement de 4 octets/ligne, ce qui suggère qu'il ne stocke qu'un entier par ligne - le type exact d'optimisation que je voulais voir. Mais essayez-le avec une matrice non-carré (lignes> colonnes) pour voir si des résultats similaires sont valables. Octave _might_ peut détecter que 'eye (N) (randperm (N), :)' est une matrice de permutation, et optimise en conséquence. – ErikR

Questions connexes