Matlab 倍频程:表示标准基向量的矩阵
假设我有一个矩阵,每一行都是一个标准基向量,即每一行正好包含一个1,其他列为0 是否有一种方便的方法来创建这样一个矩阵(即,给定一个向量,表示矩阵在每行中的位置)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个元素的矩阵,大多数元素为零,其中的元素位于所需的位置。您可以通过使用稀疏表示来节省内存:
另外,有没有一种方法可以表示这样一个矩阵,以便在倍频程中更有效地进行乘法?假设您想要一个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),:)
是一个排列矩阵,并相应地进行优化。