2015-02-24 2 views
2

Я хочу заменить значение n-го столбца матрицы на основе векторных значений в векторном виде.
Вход:Векторизация замены столбцов на основе вектора - MATLAB

[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0] 
[0 0 0 0] 

Vector:

[2] 
[4] 
[1] 
[3] 

Ожидаемый результат:

[0 1 0 0] 
[0 0 0 1] 
[1 0 0 0] 
[0 0 1 0] 

Matlab код с для цикла:

A = zeros(4,4); 
b = [2; 4; 1; 3]; 
for row=1:4 
    A(row, b(row)) = 1; 
endfor 

код Matlab с sub2i nd:

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

Вы можете использовать сырой версии из sub2ind решить его в векторизованной манере -

A((b(:)-1)*size(A,1) + [1:numel(b)]') = 1; 

Как это работает: Поскольку элементы b являются индексами столбцов и MATLAB следует столбцы индексирования , поэтому нам нужно умножить каждый такой индекс столбца на число строк в A, чтобы получить количество элементов перед началом этого столбца, который будет (b(:)-1)*size(A,1). Затем добавьте соответствующие индексы строк, т. Е. [1:numel(b)]', чтобы дать нам конечные линейные индексы, такие же, как те, которые производятся sub2ind. Наконец, индекс в A с этими линейными индексами и установите их на все 1 в соответствии с требованием вопроса.

+0

Спасибо. Можно ли использовать индексирование индекса вместо линейной индексации в Matlab для выполнения задания? – silo

+0

@silo Чтобы сделать эту работу, линейная индексация кажется лучшим выбором здесь. – Divakar

Смежные вопросы