Exploiting symmetry in multidimensional arrays

1 view (last 30 days)
Dear all, In a symmetric matrix A of size [n,n], for two indices i and j such that 1<=i<=n and 1<=j<=n we have that A(i,j)=A(j,i). Suppose I know A(i,j) for i>=j how can I efficiently set A(j,i)?
More generally, if I have a hypercube A of size n^m, how can I, on the basis of A(i1,i2,...,im) with i1>=i2>=i3....>=im, set all A for all permutations of i1,i2,...,im instead of recalculating the entry for each permutation.
Thanks,

Accepted Answer

Roger Stafford
Roger Stafford on 13 Jul 2014
For a general m-dimensional n^m array, A, do this:
[I1,I2,...,Im] = ndgrid(1:n);
P = [I1(:),I2(:),...,Im(:)];
Q = sort(P,2,'descend');
A(sub2ind(size(P),P(:,1),P(:,2),...,P(:,m))) = ...
A(sub2ind(size(Q),Q(:,1),Q(:,2),...,Q(:,m)))
Note: The four three-dot ellipses (...) shown above (but not the one following the '=' sign) are to be filled in by the user.
  4 Comments
Patrick Mboma
Patrick Mboma on 14 Jul 2014
Edited: Patrick Mboma on 14 Jul 2014
@Alfonso What you suggest would really be neat and seems to work well in the two-dimensional case that I tested. I still need to investigate higher dimensions and the speed.
Roger Stafford
Roger Stafford on 14 Jul 2014
@Patrick. Yes, you are quite right. I should have used size(A). I must have had a mental black out at that point! :-)

Sign in to comment.

More Answers (1)

Roger Stafford
Roger Stafford on 13 Jul 2014
For a 2D array it's easy:
B = tril(A,-1)
A = B+B.'+diag(A);

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!