Векторизация замены столбцов на основе вектора - MATLAB
Я хочу заменить значение n-го столбца матрицы на основе векторного значения векторным способом.
Входные данные:
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
Вектор:
[2]
[4]
[1]
[3]
Ожидаемый результат:
[0 1 0 0]
[0 0 0 1]
[1 0 0 0]
[0 0 1 0]
Код Matlab с циклом for:
A = zeros(4,4);
b = [2; 4; 1; 3];
for row=1:4
A(row, b(row)) = 1;
endfor
Код Matlab с sub2ind:
A = zeros(4,4);
b = [2; 4; 1; 3];
c = [[1:length(b)]' b];
A(sub2ind(size(A), c(:,1), c(:,2))) = 1;
Есть ли в Matlab более векторизованный способ? Спасибо.
1 ответ
You can use the raw version of sub2ind
to solve it in a vectorized manner -
A( (b(:)-1)*size(A,1) + [1:numel(b)]' ) = 1;
How it works: Since elements of b
are the column indices and MATLAB follows column-major indexing, so we need to multiply each such column index with the number of rows in A
to get us the number of elements before starting that column, which would be (b(:)-1)*size(A,1)
, Then, add the corresponding row indices ie [1:numel(b)]'
чтобы дать нам окончательные линейные индексы, такие же, как те, которые произведены sub2ind
, Наконец, индекс в A
с этими линейными индексами и установить их для всех 1
в соответствии с требованием вопроса.