对于大小为nx 1的向量V,我想创建大小为nx Max(V)的二进制指示符矩阵M,以使M的行条目在相应的列索引中具有1,否则为0。
例如:如果V是
V = [ 3
2
1
4]
指标矩阵应为
M= [ 0 0 1 0
0 1 0 0
1 0 0 0
0 0 0 1]
关于这样的指标矩阵的事情是,如果使它稀疏会更好。无论如何,您几乎总是会与它进行矩阵相乘,因此使该乘法成为有效的矩阵。
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.
一种快速执行此操作的方法-如果不需要稀疏矩阵-创建大小至少为max(v)的单位矩阵,然后通过从v提取索引来创建指标矩阵:
m = max(V);
I = eye(m);
V = I(V, :);
您可以简单地将列索引V与行索引结合在一起以创建线性索引,然后使用它来填充M(初始化为零):
M = zeros(numel(V), max(V));
M((1:numel(V))+(V.'-1).*numel(V)) = 1;
举报