matlab - Creating a diagonal matrix (higher dimension) -
i have n
* m
matrix, a
. i'd create next m
* m
*n
matrix, b
for j=1:n b(:,:,j)=diag(a(j,:)); end
how do without having loop?
thanks
update: i've edited question prepare typos in sample code.
i'm sure illustration code contains couple of typos, since matrix a
serves no purpose, nor looping subscript j
. however, seems reasonably trying inquire is: how build 3d array each diagonal (moving along 3rd dimension) row a
, without doing loop?
if correct, 1 reply follows:
%# loop-less solution soln2 = zeros(m, m, n); soln2(bsxfun(@plus, (1:m+1:m*m)', (0:m^2:(n-1)*m^2))) = a';
essentially i've done pre-allocate solution 3d array, , used bsxfun
build linear index of diagonals, moving along 3rd dimension. assign transpose of a
(because want rows not columns) linear index in solution array.
note, i've pasted sample code testing purposes below. please verify interpretation of loop-based solution after.
%# set parameters , create random matrix n = 3; m = 4; = randi(5, n, m); %# loop based solution soln1 = nan(m, m, n); n = 1:n soln1(:,:,n) = diag(a(n,:)); end %# loop-less solution soln2 = zeros(m, m, n); soln2(bsxfun(@plus, (1:m+1:m*m)', (0:m^2:(n-1)*m^2))) = a';
matlab
No comments:
Post a Comment