matrix_balance#
- scipy.linalg.matrix_balance(A, permute=True, scale=True, separate=False, overwrite_a=False)[Quelle]#
Berechnet eine diagonale Ähnlichkeitstransformation zur Zeilen-/Spaltenbalancierung.
Die Balancierung versucht, die Zeilen- und Spalten-1-Normen durch Anwendung einer Ähnlichkeitstransformation zu egalisieren, sodass die Größenvariation der Matrixeinträge in den Skalierungsmatrizen widergespiegelt wird.
Außerdem wird die Matrix, falls aktiviert, zuerst permutiert, um die oberen Dreiecksteile der Matrix zu isolieren, und, falls auch Skalierung aktiviert ist, werden nur die verbleibenden Teilblöcke skaliert.
Die Dokumentation wurde unter der Annahme verfasst, dass die Array-Argumente bestimmte „Kern“-Formen haben. Array-Argumente dieser Funktion können jedoch zusätzliche „Batch“-Dimensionen vorangestellt haben. In diesem Fall wird das Array als Stapel von niedrigdimensionalen Schnitten behandelt; siehe Gestapelte lineare Operationen für Details.
- Parameter:
- A(n, n) array_like
Quadratische Datenmatrix für die Balancierung.
- permutebool, optional
Der Selektor, um zu definieren, ob auch eine Permutation von A vor der Skalierung durchgeführt wird.
- scalebool, optional
Der Selektor zum Ein- und Ausschalten der Skalierung. Wenn False, wird die Matrix nicht skaliert.
- separatebool, optional
Dies schaltet die Rückgabe einer vollständigen Matrix der Transformation auf ein Tupel aus zwei separaten 1-D-Permutations- und Skalierungsvektoren um.
- overwrite_abool, optional
Dies wird direkt an xGEBAL übergeben. Überschreibt im Wesentlichen das Ergebnis in den Daten. Es kann die Speicherplatzersparnis erhöhen. Siehe LAPACK-Handbuch für Details. Dies ist standardmäßig False.
- Rückgabe:
- B(n, n) ndarray
Balancierte Matrix
- T(n, n) ndarray
Eine möglicherweise permutierte Diagonalmatrix, deren Nicht-Null-Einträge ganzzahlige Potenzen von 2 sind, um numerische Abschneidefehler zu vermeiden.
- scale, perm(n,) ndarray
Wenn das Schlüsselwort
separateauf True gesetzt ist, werden statt der obigen MatrixTdie Skalierungs- und Permutationsvektoren separat als Tupel ohne die vollständige MatrixTausgegeben.
Hinweise
Die balancierte Matrix erfüllt die folgende Gleichung
\[B = T^{-1} A T\]Die Skalierungskoeffizienten werden auf die nächste Zweierpotenz gerundet, um Rundungsfehler zu vermeiden.
Dieser Algorithmus ist besonders nützlich für Eigenwert- und Matrixzerlegungen und wird in vielen Fällen bereits von verschiedenen LAPACK-Routinen aufgerufen.
Der Algorithmus basiert auf der bekannten Technik von [1] und wurde modifiziert, um Sonderfälle zu berücksichtigen. Siehe [2] für Details, die seit LAPACK v3.5.0 implementiert wurden. Vor dieser Version gab es Eckfälle, in denen die Balancierung die Konditionierung tatsächlich verschlechtern kann. Siehe [3] für solche Beispiele.
Der Code ist ein Wrapper um die xGEBAL-Routinenfamilie von LAPACK zur Matrixbalancierung.
Hinzugefügt in Version 0.19.0.
Referenzen
[1]B.N. Parlett und C. Reinsch, „Balancing a Matrix for Calculation of Eigenvalues and Eigenvectors“, Numerische Mathematik, Bd. 13(4), 1969, DOI:10.1007/BF02165404
[2]R. James, J. Langou, B.R. Lowery, „On matrix balancing and eigenvector computation“, 2014, arXiv:1401.5766
[3]D.S. Watkins. Ein Fall, in dem die Balancierung schädlich sein kann. Electron. Trans. Numer. Anal, Bd. 23, 2006.
Beispiele
>>> import numpy as np >>> from scipy import linalg >>> x = np.array([[1,2,0], [9,1,0.01], [1,2,10*np.pi]])
>>> y, permscale = linalg.matrix_balance(x) >>> np.abs(x).sum(axis=0) / np.abs(x).sum(axis=1) array([ 3.66666667, 0.4995005 , 0.91312162])
>>> np.abs(y).sum(axis=0) / np.abs(y).sum(axis=1) array([ 1.2 , 1.27041742, 0.92658316]) # may vary
>>> permscale # only powers of 2 (0.5 == 2^(-1)) array([[ 0.5, 0. , 0. ], # may vary [ 0. , 1. , 0. ], [ 0. , 0. , 1. ]])