октава: представление матриц стандартных базисных векторов - PullRequest
1 голос
/ 18 ноября 2011

Предположим, у меня есть матрица такая, что каждая строка является стандартным базисным вектором, то есть каждая строка содержит ровно одну 1, остальные столбцы равны 0.

Есть ли удобный способ создать такую ​​матрицу (т. Е. Заданный вектор положений, в котором единицы находятся в каждой строке)?

Кроме того, есть ли способ, которым я должен представлять такую ​​матрицу, чтобы умножения с ней можно было сделать более эффективно в октаве?

1 Ответ

2 голосов
/ 18 ноября 2011

Предположим, вам нужна матрица 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 особенный, возможно, он уже использует преимущества ускорений в умножении.

...