File Exchange

## SUB2IND4UP Linear index from subscripts of upper triangular matrix (only elements above diagonal)

version 1.2 (1.82 KB) by

Single index for given subscripts of a 2D upper matrix, (no elements over the diagonal)

Updated

IND = SUB2IND4UP(I, J) returns the linear index equivalent to the row and column subscripts I and J
Let ind be a vector of indexes for entries of some upper triangular matrix. The entries are selected vertically so that:

ind = 1 is associated to entry (1, 2)
ind = 2 is associated to entry (1, 3)
ind = 3 is associated to entry (2, 3)
ind = 4 is associated to entry (1, 4)
...
ind = N * (N - 1) / 2 is associated to entry (N - 1, N)

***********************************************************************

EXAMPLE

If
A = rand(10);
and
b = A(find(triu(A, 1)));
then, given subscripts
I = [1:9];
and
J = [2:10];
for matrix A, these are equivalent to indices
IND = sub2ind4up(I, J);
for vector b. In fact:
all(A(sub2ind(size(A), I, J)) == b(IND)')

ans =
1

This is obtained without even knowing about size(A)

***********************************************************************

Bruno Luong

### Bruno Luong (view profile)

Why restrict on one level upper diagonal? It is too restrictive. It should be able to handle lower and upper, with all the shift, positive or negative.

Liber Eleutherios

### Liber Eleutherios (view profile)

% Note that if
A = rand(10);
% and
b = A(find(triu(A, 1)));
% then, given subscripts
I = [1:9];
% and
J = [2:10];
% for matrix A, these are equivalent to
IND = sub2ind4up(I, J);
% for vector b. Infact:
all(A(sub2ind([10, 10], I, J)) == b(IND)')
%
% ans =
%
% 1
%
% This is obtained without even knowing about size(A).