3 回答
TA贡献1865条经验 获得超7个赞
关于这样的指标矩阵的事情是,如果使它稀疏会更好。无论如何,您几乎总是会与它进行矩阵相乘,因此使该乘法成为有效的矩阵。
n = 4;
V = [3;2;1;4];
M = sparse(V,1:n,1,n,n);
M =
(3,1) 1
(2,2) 1
(1,3) 1
(4,4) 1
如果您坚持说M是一个完整矩阵,那么事后就可以通过使用full使它变得如此简单。
full(M)
ans =
0 0 1 0
0 1 0 0
1 0 0 0
0 0 0 1
了解如何使用稀疏矩阵。这样做将使您受益匪浅。诚然,对于4x4矩阵,稀疏不会带来太多收益。但是这些示例案例从来都不是您真正的问题。假设n确实是2000?
n = 2000;
V = randperm(n);
M = sparse(V,1:n,1,n,n);
FM = full(M);
whos FM M
Name Size Bytes Class Attributes
FM 2000x2000 32000000 double
M 2000x2000 48008 double sparse
稀疏矩阵不仅会在使用的内存方面获得收益。比较单个矩阵相乘所需的时间。
A = magic(2000);
tic,B = A*M;toc
Elapsed time is 0.012803 seconds.
tic,B = A*FM;toc
Elapsed time is 0.560671 seconds.
TA贡献1946条经验 获得超3个赞
您可以简单地将列索引V与行索引结合在一起以创建线性索引,然后使用它来填充M(初始化为零):
M = zeros(numel(V), max(V));
M((1:numel(V))+(V.'-1).*numel(V)) = 1;
- 3 回答
- 0 关注
- 615 浏览
添加回答
举报