创建指标矩阵

Lea*_*ner 24 arrays matlab matrix

对于向量V的大小为nx 1,我想创建二进制指示符矩阵中号的大小为nx最大(V) ,使得所述行条目中号具有1中的相应的列的索引,0否则.

例如:如果V

V = [ 3
      2
      1
      4]
Run Code Online (Sandbox Code Playgroud)

指标矩阵应该是

M= [ 0 0 1 0
     0 1 0 0
     1 0 0 0
     0 0 0 1]
Run Code Online (Sandbox Code Playgroud)

小智 30

像这样的指标矩阵的事情是,如果你使它稀疏是更好的.无论如何,你几乎总是在做矩阵乘法,所以要使它成倍增加.

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
Run Code Online (Sandbox Code Playgroud)

如果你坚持M是一个完整的矩阵,那么通过使用full来实现它是很简单的.

full(M)
ans =
     0     0     1     0
     0     1     0     0
     1     0     0     0
     0     0     0     1
Run Code Online (Sandbox Code Playgroud)

了解如何使用稀疏矩阵.这样做会让你获益匪浅.不可否认,对于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    
Run Code Online (Sandbox Code Playgroud)

稀疏矩阵不仅仅在使用的内存方面获得.比较单个矩阵乘法所需的时间.

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.
Run Code Online (Sandbox Code Playgroud)


小智 7

一个快速的方法 - 如果你不需要稀疏矩阵 - 是创建一个大小至少为max(v)的单位矩阵,然后通过从v中提取索引来创建指标矩阵:

m = max(V);
I = eye(m);
V = I(V, :);
Run Code Online (Sandbox Code Playgroud)