Hello:

I just found that there is still an issue with the following process to extract the upper triangular elements of a matrix without the diagonals if the matrix size is more than 3.

a_uv = packr(vech(diagrv(x, error(0))'));

So, I wanted to extract the upper triangular elements row wise meaning if x = { 1 2 3 4, 5 6 7 8, 9 10 11 12, 13 14 15 16}; I wanted to get 2,3,4,7,8,12 in this order, but what it does is it returns me 2,3,7,4,8,12. since vech operates row wise. Does it sound alright? Is there a quick fix for it?

Thanks

Annesha

## 1 Answer

0

If you know for certain that your upper triangle will not have any elements that equal 0, then you could do this:

a = { 1 2 3 4, 5 6 7 8, 9 10 11 12, 13 14 15 16 } a_uv = packr(miss(vecr(upmat(diagrv(z, 0))), 0));

If you may have elements in the upper triangle that are equal to zero, then you could do this:

a = { 1 2 3 4, 5 6 7 8, 9 10 11 12, 13 14 15 16 }; a_uv = packr(vec(a) + vecr(miss(upmat(ones(rows(a), cols(a))), 1)));

or this:

a_uv = selif(vecr(a), vecr(lowmat(reshape(error(0), rows(a), cols(a)))) .== 0)

## Your Answer

## 1 Answer

If you know for certain that your upper triangle will not have any elements that equal 0, then you could do this:

a = { 1 2 3 4, 5 6 7 8, 9 10 11 12, 13 14 15 16 } a_uv = packr(miss(vecr(upmat(diagrv(z, 0))), 0));

If you may have elements in the upper triangle that are equal to zero, then you could do this:

a = { 1 2 3 4, 5 6 7 8, 9 10 11 12, 13 14 15 16 }; a_uv = packr(vec(a) + vecr(miss(upmat(ones(rows(a), cols(a))), 1)));

or this:

a_uv = selif(vecr(a), vecr(lowmat(reshape(error(0), rows(a), cols(a)))) .== 0)