Norm einer Matrix

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TCH
User
Beiträge: 2
Registriert: Samstag 11. Juni 2011, 00:11

Nabend,
ich hab zuvor noch nie mit Python programmiert, jetzt muss ich jedoch ein Programm erstellen,
das unter anderem die Norm einer Matrix berechnet. Die Norm berechnet sich aus der
Wurzel der Summe jeder Matrixzahl hoch 2. Ich nehm also jede Zahl aus der Matrix hoch zwei und addier sie.
So wollt ich das umsetzen:

Code: Alles auswählen

import numpy 
import math
def matCond(A) :
    for i in range (len(A)) :
        for j in range (len(A)) :
            C=math.sqrt(C + (A[i,j])*(A[i,j]))
    return C
Jetzt bekomm ich als Fehlermeldung TypeError: tuple indices must be integers, not tuple
Ich denke das liegt daran dass die Zahlen die ich mir mit den Schleifen einzeln rausnehme
Skalare oder Vektoren sind. Habs auch schon mit int(A[i,j]) probiert, funktioniert aber auch nicht.
Zuletzt geändert von Anonymous am Samstag 11. Juni 2011, 09:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hallo TCH und Willkommen im Forum,

die Fehlermeldung kommt vermutlich daher, dass A eine verschachtelte Liste ist. Mit Listen funktioniert A[i,j] nicht. Stattdessen müsstest du A[j] verwenden. Ich würde dir aber empfehlen, A in der ersten Zeile deiner Funktion in einen NumPy-Array umzuwandeln. Damit lässt sich einfacher Arbeiten.

Noch ein paar weitere Anmerkungen:
- Verwende bitte den Python Tags für deinen Code, damit das Einrücken nicht verloren geht.
- Das math Modul ist überflüssig, wenn du NumPy verwendest, z.B. "numpy.sqrt".
- Dem Name C wird vor dem ersten Zugriff, kein Objekt zugewiesen, z.B. "C = 0".
- Lass dir mal die Werte von i und j in der Schleife ausgeben.
- Wenn du über alle Elemente von A iterieren möchtest bietet sich bei Numpy "for a in A.flat:" an.
- Schau dir deinen Algorithmus nochmal genau an!
- Nach der Python Namenskonvention (PEP8) werden Namen von Funktionen klein und mit Unterstrich geschrieben, daher wäre "mat_cond" besser.

Es ist natürlich schon jemand vor die auf die Idee gekommen, die Matrixnorm in Python zu schreiben:

Code: Alles auswählen

In [70]: A = numpy.arange(16).reshape(4,4)

In [71]: A
Out[71]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [72]: numpy.linalg.norm(A)
Out[72]: 35.213633723318019
TCH
User
Beiträge: 2
Registriert: Samstag 11. Juni 2011, 00:11

Wow Danke, das war sehr umfangreich :)
Antworten