将值为{1,...,K}的列向量转换为K列列,并在相应列中使用1

时间:2013-12-26 06:46:12

标签: matlab matrix octave vectorization

说我有一个向量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,我对矢量化相对较新,而且很多矢量化代码对我来说都是这样)。

1 个答案:

答案 0 :(得分:4)

如果您希望结果为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;