Предположим, вам нужна матрица 3x3 с матрицами в столбцах 3, 1 и 2 соответственно:
> pos = [3,1,2];
> x = eye(3)(pos,:);
даст вам матрицу с 9 элементами, чаще всего с нулем, с элементами в нужных местах.,Вы можете сэкономить память, используя разреженное представление: sparse_x = sparse(x);
.Но следующий тест на моей машине подразумевает, что естественная форма умножается быстрее:
> 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
Это была Octave 3.4 на Core i7, YMMV.
Глядя на whos
, кажется, что Octaveделает что-то умное с 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!
Если он знает, что x
особенный, возможно, он уже использует преимущества ускорений в умножении.