scipy.linalg.

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 separate auf True gesetzt ist, werden statt der obigen Matrix T die Skalierungs- und Permutationsvektoren separat als Tupel ohne die vollständige Matrix T ausgegeben.

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. ]])