Matlab 倍频程:表示标准基向量的矩阵

Matlab 倍频程:表示标准基向量的矩阵,matlab,matrix,octave,sparse-matrix,matrix-multiplication,Matlab,Matrix,Octave,Sparse Matrix,Matrix Multiplication,假设我有一个矩阵,每一行都是一个标准基向量,即每一行正好包含一个1,其他列为0 是否有一种方便的方法来创建这样一个矩阵(即,给定一个向量,表示矩阵在每行中的位置) 另外,有没有一种方法可以表示这样一个矩阵,以便在倍频程中更有效地进行乘法?假设您想要一个3x3矩阵,其中的矩阵分别位于第3、1和2列: > pos = [3,1,2]; > x = eye(3)(pos,:); 将为您提供一个包含9个元素的矩阵,大多数元素为零,其中的元素位于所需的位置。您可以通过使用稀疏表示来节省内存:

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

是否有一种方便的方法来创建这样一个矩阵(即,给定一个向量,表示矩阵在每行中的位置)


另外,有没有一种方法可以表示这样一个矩阵,以便在倍频程中更有效地进行乘法?

假设您想要一个3x3矩阵,其中的矩阵分别位于第3、1和2列:

> pos = [3,1,2];
> x = eye(3)(pos,:);
将为您提供一个包含9个元素的矩阵,大多数元素为零,其中的元素位于所需的位置。您可以通过使用稀疏表示来节省内存:
sparse\ux=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
这是核心i7的倍频程3.4,YMMV

查看
,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!
>谁
当前范围中的变量:
属性名称大小字节类
==== ====        ====                     =====  ===== 
N 1x1 8双
s 10000x10000 80000000双倍
不锈钢10000x100080000000双
ss2 10000x10000 80000000双精度
sx 10000x10004双

x1000x10000 40000倍这很有趣。
x
的存储空间只有4个字节/行,这表明它每行只存储一个整数-这正是我想要看到的优化类型。但是试着用一个非正方形矩阵(行>列)看看是否有类似的结果。倍频程可能检测到
eye(N)(randperm(N),:)
是一个排列矩阵,并相应地进行优化。