为了账号安全,请及时绑定邮箱和手机立即绑定

创建指标矩阵

/ 猿问

创建指标矩阵

哆啦的时光机 2019-11-19 14:31:04

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


查看完整描述

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;toc

Elapsed time is 0.012803 seconds.


tic,B = A*FM;toc

Elapsed time is 0.560671 seconds.


查看完整回答
反对 回复 2019-11-19
?
白板的微信

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


m = max(V);

I = eye(m);

V = I(V, :);


查看完整回答
反对 回复 2019-11-19
?
智慧大石

您可以简单地将列索引V与行索引结合在一起以创建线性索引,然后使用它来填充M(初始化为零):


M = zeros(numel(V), max(V));

M((1:numel(V))+(V.'-1).*numel(V)) = 1;


查看完整回答
反对 回复 2019-11-19
  • 3 回答
  • 0 关注
  • 66 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信