октава: представление матриц стандартных базисных векторов

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

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

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


person ErikR    schedule 18.11.2011    source источник


Ответы (1)


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

person mtrw    schedule 18.11.2011
comment
Это интересно. Хранилище для x составляет всего 4 байта на строку, что говорит о том, что в каждой строке хранится только одно целое число — именно такую ​​оптимизацию я и хотел увидеть. Но попробуйте это с неквадратной матрицей (строки › ​​столбцы), чтобы увидеть, верны ли аналогичные результаты. Octave возможно определяет, что eye(N)(randperm(N),:) является матрицей перестановок, и соответствующим образом оптимизирует. - person ErikR; 18.11.2011