【问题标题】:Convert a column vector with values in {1,...,K} to a K-column matrix with a 1 in the appropriate column将值在 {1,...,K} 中的列向量转换为相应列中为 1 的 K 列矩阵
【发布时间】:2013-12-26 06:46:12
【问题描述】:

假设我有一个矢量y 喜欢

 2
 4
 3
10

我想得到一个矩阵

0   1   0   0   0   0   0   0   0   0
0   0   0   1   0   0   0   0   0   0
0   0   1   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   1

在 octave/matlab 中最简单/最干净/“最好”的方法是什么?我想出了:

repmat(y, 1, 10) == repmat(1:10, 4, 1)

还有比这更好的方法吗?在考虑之后对我来说是有意义的,但我觉得对于阅读代码的人来说解析有点困难(虽然 idk,我对矢量化相对较新,很多矢量化代码对我来说都是这样的)。

【问题讨论】:

  • 所以“更好”是指“更容易阅读?”
  • @RobertHarvey 我想,除非这只是以牺牲其他重要的东西(例如,效率)为代价的情况。我是 octave 的新手,所以我主要是想知道更熟悉它的人如何实现这个
  • @alecbenzer 不要在这里repmat... 非常浪费内存。如果可以,请使用sparse 表示您的结果...

标签: matlab matrix octave vectorization


【解决方案1】:

如果你希望你的结果是sparse,你可以简单地

n = numel( y ); % number of rows in resulting matrix
k = max(y(:)); % if you do not know k (num of columns) in advance
U = sparse( 1:n, y, 1, n, k );

如果你希望你的结果是一个完整的矩阵

U = zeros( n, k );
U( sub2ind([n k], 1:n, y ) ) = 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2014-03-09
    • 2018-07-17
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多