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