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

Как получить диагональную матрицу из вектора A

У меня есть столбец:

0.0677
0.0584
0.0487
0.0453
0.0394

Какая инструкция получит следующий вывод

0.0677   0          0         0          0
0        0.0584     0         0          0
0        0          0.0487    0          0
0        0          0         0.0453     0
0        0          0         0          0.0394
4b9b3361

Ответ 1

Если я правильно помню, команда вызывала что-то вроде diag(A)

Изменить: здесь вы можете найти документацию по diag http://www.mathworks.com/help/techdoc/ref/diag.html

обратите особое внимание на цитату:

X = diag (v) ставит v на главную диагональ, такую ​​же, как и выше, с k = 0.

Ответ 2

diag - это нормальное решение MATLAB (как указано posdef.) Таким образом,

D = diag(vec);

дает необходимую матрицу с диагональными элементами.

Возможно, лучше в некоторых приложениях создать разреженную матрицу, так как диагональная матрица довольно разрежена. Поэтому, если вы выполняете умножение матрицы, это значительно поможет уменьшить количество ненужных операций.

n = length(vec);
D = spdiags(vec(:),0,n,n);

Если вы действительно хотели выполнить назначение в явном виде, используйте один линейный индекс, например:

n = length(vec);
D = zeros(n);
D(cumsum([1,repmat(n+1,1,n-1)])) = vec;

Или вы можете использовать функцию sub2ind для преобразования набора индексов в один индекс.

Ответ 3

Ниже приводится диагональная матрица D, диагональ которой есть вектор vec. Он написан в векторном виде в MATLAB.

D      = zeros(numel(vec));
[I,J]  = ind2sub(size(D),1:numel(D));
ind    = [I(:) J(:)];
ind    = find(ind(:,1)==ind(:,2));
D(ind) = vec;

Ответ 4

Ну, очевидно, вы можете сделать это с помощью C-like. Прямо сейчас я не могу найти более элегантное решение.

vector;%Your vector
vec_length = length(vector);
A = zeros(vec_length);
for i=1:vec_length
   A(i,i)  = vector(i);
end;