Как получить диагональную матрицу из вектора - PullRequest
15 голосов
/ 09 марта 2011

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

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

Ответы [ 4 ]

25 голосов
/ 09 марта 2011

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 для преобразования набора индексов в один индекс.

13 голосов
/ 09 марта 2011

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

Редактировать: вот, пожалуйста, некоторая документация по diag http://www.mathworks.com/help/techdoc/ref/diag.html

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

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

3 голосов
/ 19 июня 2013

Ниже приводится диагональная матрица 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;
1 голос
/ 09 марта 2011

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

vector;%Your vector
vec_length = length(vector);
A = zeros(vec_length);
for i=1:vec_length
   A(i,i)  = vector(i);
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...