我有一个长度为n的向量y。 y(i)是1..m的整数。有没有更简单的方法将y转换为n x m逻辑矩阵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);
或
% 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);
答案 0 :(得分:11)
您可以将bsxfun用于此
yy = bsxfun(@eq,y(:),[1,2,3])
y
被转换(如果需要)到列向量,而另一个向量是行向量。 bsxfun
隐式扩展m-by-1和1-by-n数组,使结果变为m-by-n。
答案 1 :(得分:5)
如果n * m足够大(m本身足够大),最好将yy
创建为稀疏矩阵。您的y
向量实际上是一种特殊类型的稀疏矩阵格式,但我们可以通过执行以下操作将其转换为内置稀疏矩阵格式。
yy = sparse(1:length(y), y, 1);
这会使您的存储空间保持为O(n)。如果您使用yy
进行大量索引,那么它不会给您带来很多好处。如果是这种情况,最好使用原始的稀疏结构(即y
)。
答案 2 :(得分:1)
对您的方法略有修改:
% A n-dimensional vector y, with values in some range 1..m
m = 4;
n = 7;
y = randi([1 m], n, 1);
% Preallocating a n by m matrix of zeros
nXm = zeros(n, m);
% In each pass of this loop a single column of nXm is updated, where
% for each column index j in nXm, if y(i) = j then nXm(i,j) = 1
for j = 1:m;
nXm(:,j) = (y == j);
end
答案 3 :(得分:1)
来自Coursera的机器学习:
yy = eye(m)(y, :)
这要求列表为范围1:m
(如OP所述)。对于不规则列表,例如[2 3 5]
,请执行此操作
yy = eye(m)(:, [2 3 5])(y, :)
注意:未在MATLAB上测试。
答案 4 :(得分:0)
在八度中,您可以编写:
yy = y' == (1:m); % or y == (1:m)' for transposed
[1 2 1 3 2] == [1 2 3]' % = [1 0 1 0 0; 0 1 0 0 1; 0 0 0 1 0]