假设我有一个矩阵,每行都是一个标准基矢量,即每行只包含一个1,其他列为0。
有没有一种方便的方法来创建这样一个矩阵(即给出一个位置的向量,每个位置在每一行中)?
另外,有没有一种方法可以代表这样一个矩阵,以便在八度音程中更有效地进行乘法运算?
答案 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
是特殊的,那么它可能已经在乘法中利用了加速。