八度:表示标准基矢量的矩阵

时间:2011-11-18 02:10:42

标签: matlab matrix octave sparse-matrix matrix-multiplication

假设我有一个矩阵,每行都是一个标准基矢量,即每行只包含一个1,其他列为0。

有没有一种方便的方法来创建这样一个矩阵(即给出一个位置的向量,每个位置在每一行中)?

另外,有没有一种方法可以代表这样一个矩阵,以便在八度音程中更有效地进行乘法运算?

1 个答案:

答案 0 :(得分:2)

假设您想要一个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

这是Core i7上的Octave 3.4,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是特殊的,那么它可能已经在乘法中利用了加速。