Подтвердить что ты не робот

Преобразовать вектор в логическую матрицу?

У меня есть вектор y длины n. 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);
4b9b3361

Ответ 1

Вы можете использовать bsxfun для этого

yy = bsxfun(@eq,y(:),[1,2,3])

y преобразуется (если необходимо) в вектор-столбец, а другой вектор является вектором строки. bsxfun неявно расширяет массивы m-by-1 и 1-by-n, так что результат становится m-by-n.

Ответ 2

Если n * m достаточно велико (и m само по себе достаточно велико), неплохо создать yy как разреженную матрицу. Ваш вектор y действительно является особым типом разреженного матричного формата, но мы можем перевести его во встроенный разреженный формат матрицы, выполнив следующие действия.

yy = sparse(1:length(y), y, 1);

Это сохранит ваше хранилище до O (n). Это не принесет вам много пользы, если вы используете yy для большого количества индексирования. Если это так, вам лучше использовать свою оригинальную разреженную структуру (т.е. y).

Ответ 3

Небольшое изменение вашего метода:

% 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

Ответ 4

От машинного обучения на Coursera:

yy = eye(m)(y, :)

Это требует, чтобы список был диапазоном 1:m (как указано OP). Для нерегулярного списка, например [2 3 5], сделайте это

yy = eye(m)(:, [2 3 5])(y, :)

Примечание: не проверено на MATLAB.