将矢量转换为逻辑矩阵?

时间:2011-11-08 01:42:11

标签: matlab octave

我有一个长度为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);

5 个答案:

答案 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]