Векторизация замены столбцов на основе вектора - 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 в соответствии с требованием вопроса.

Другие вопросы по тегам