对于大小 nx 1 的矢量 V ,我想创建大小 nx Max的二进制指标矩阵 M (V), 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]
答案 0 :(得分:29)
像这样的指标矩阵的事情是,如果你使它稀疏是更好的。无论如何,你几乎总是在做矩阵乘法,所以要使它成倍增加。
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(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.
答案 1 :(得分:7)
快速实现此目的 - 如果您不需要稀疏矩阵 - 是创建一个大小至少为max(v)的单位矩阵,然后通过从v中提取索引来创建指标矩阵:
m = max(V);
I = eye(m);
V = I(V, :);
答案 2 :(得分:1)
为了记忆起见,您希望创建索引矩阵是稀疏的。它很简单:
vSize = size(V);
Index = sparse(vSize(1),max(V));
for i = 1:vSize(1)
Index(i, v(i)) = 1;
end
我自己用过这个,享受:)
答案 3 :(得分:1)
这是另一种方法,类似于sparse
,但accumarray
:
V = [3; 2; 1; 4];
M = accumarray([(1:numel(V)).' V], 1);
答案 4 :(得分:1)
您可以简单地将V
中的列索引与行索引合并以创建linear index,然后使用它来填充M
(初始化为零):
M = zeros(numel(V), max(V));
M((1:numel(V))+(V.'-1).*numel(V)) = 1;
答案 5 :(得分:0)
M=sparse(V,1:size(V,1),1)';
将生成一个稀疏矩阵,您可以在计算中将其用作完整版本。 您可以使用完整(M)到"充气" M实际存储零。