将矢量转换为逻辑矩阵?

not*_*ick 14 matlab octave

我有一个长度为n的向量y.y(i)是1..m的整数.是否有更简单的方法将y转换为nxm逻辑矩阵yy,其中yy(i,j)= 1如果y(i)= j,否则为0?这就是我一直在做的事情:

% If m is known (m = 3 here), you could write it out all at once
yy = [y == 1; y== 2; y == 3];
yy = reshape(yy, n, 3);
Run Code Online (Sandbox Code Playgroud)

要么

% if m is not known ahead of time
yy = [ y == 1 ];
for i = 2:m;
    yy = [ yy; y == i ];
end
yy = reshape(yy, n, m);
Run Code Online (Sandbox Code Playgroud)

Jon*_*nas 12

您可以使用bsxfun

yy = bsxfun(@eq,y(:),[1,2,3])
Run Code Online (Sandbox Code Playgroud)

y被转换(如果需要)到列向量,而另一个向量是行向量.bsxfun隐式扩展m-by-1和1-by-n数组,使结果变为m-by-n.


Dav*_*ber 5

如果n*m足够大(并且m本身足够大),则最好创建yy一个稀疏矩阵.您的y向量实际上是一种特殊类型的稀疏矩阵格式,但我们可以通过执行以下操作将其转换为内置稀疏矩阵格式.

yy = sparse(1:length(y), y, 1);
Run Code Online (Sandbox Code Playgroud)

这将使您的存储空间保持为O(n).如果您使用yy大量索引,那么它不会给您带来很多好处.如果是这种情况,最好使用原始的稀疏结构(即y).