创建指标矩阵

时间:2011-05-27 09:15:55

标签: arrays matlab matrix

对于大小 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]

6 个答案:

答案 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实际存储零。