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.
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