Exploiting symmetry in multidimensional arrays
2 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Patrick Mboma
il 13 Lug 2014
Commentato: Roger Stafford
il 14 Lug 2014
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,
0 Commenti
Risposta accettata
Roger Stafford
il 13 Lug 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 Commenti
Roger Stafford
il 14 Lug 2014
@Patrick. Yes, you are quite right. I should have used size(A). I must have had a mental black out at that point! :-)
Più risposte (1)
Roger Stafford
il 13 Lug 2014
For a 2D array it's easy:
B = tril(A,-1)
A = B+B.'+diag(A);
0 Commenti
Vedere anche
Categorie
Scopri di più su Matrix Indexing in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!