Преобразовать вектор индексов в матрицу - PullRequest
6 голосов
/ 30 марта 2012

Я хочу преобразовать вектор индексов в матрицу с единицами в столбцах индексов.

x = [2;1;3;1];
m = someFunc(x,3)
% m =
%
%   0   1   0
%   1   0   0
%   0   0   1
%   1   0   0

Ответы [ 4 ]

15 голосов
/ 17 сентября 2012

Я протестировал функцию sub2ind, но на форуме Coursera Machine Learning мне указали на эту красоту.

m = eye(num_cols)(x,:);

В нем используется единичная матрица для выбора соответствующего столбца на основе значения в x.

3 голосов
/ 30 марта 2012

Один из способов - использовать функцию SUB2IND:

colN = 3;
assert(max(x)<=colN,'Not enough columns') %# check that you have enough columns
%# other checks that x is valid indices

m = zeros(numel(x),colN);
m(sub2ind(size(m),1:numel(x),x')) = 1;
1 голос
/ 10 августа 2012

У меня был очень похожий вопрос, поэтому я не хотел открывать новый.Я хотел преобразовать вектор строки индексов в матрицу с единицами в строках (вместо столбцов) индексов.Я мог бы использовать предыдущий ответ и перевернуть его, но я думал, что это будет работать лучше с очень большими матрицами.

octave> x = [2 1 3 1];
octave> m = setRowsToOne(x, 3)
m =

   0   1   0   1
   1   0   0   0
   0   0   1   0

Я не мог понять, как использовать sub2ind, чтобы выполнить это, поэтому я рассчитал его сам.

function matrixResult = setRowsToOne(indexOfRows, minimumNumberOfRows)
   numRows = max([indexOfRows minimumNumberOfRows]);
   numCols = columns(indexOfRows);
   matrixResult = zeros(numRows, numCols);
   assert(indexOfRows > 0, 'Indices must be positive.');
   matrixResult(([0:numCols-1]) * numRows + indexOfRows) = 1;
end

x = [2 1 3 1];
m = setRowsToOne(x, 3)
0 голосов
/ 28 сентября 2015

Вы можете использовать accumarray, что делает это очень простым, например:

accumarray([ (1:length(x))', x ], 1, [4, 3])

Часть 1:length(x) указывает, в какие строки идут эти строки, и xв какие столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...