创建指标矩阵

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


哆啦的时光机
浏览 581回答 3
3回答

莫回无

关于这样的指标矩阵的事情是,如果使它稀疏会更好。无论如何,您几乎总是会与它进行矩阵相乘,因此使该乘法成为有效的矩阵。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;tocElapsed time is 0.012803 seconds.tic,B = A*FM;tocElapsed time is 0.560671 seconds.

智慧大石

您可以简单地将列索引V与行索引结合在一起以创建线性索引,然后使用它来填充M(初始化为零):M = zeros(numel(V), max(V));M((1:numel(V))+(V.'-1).*numel(V)) = 1;
打开App,查看更多内容
随时随地看视频慕课网APP