Matrix-Plus-Algebra

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
Immortalmemo
User
Beiträge: 13
Registriert: Mittwoch 22. Oktober 2014, 00:02
Wohnort: Berlin

Guten Abend,

liebe Python-Gemeinde. Ich sitze im Moment an einer Aufgabe wo ich die Matrix-Plus-Algebra zweier Matrizen A,B berechnen muss
Der Eintrag Mij in Zeile i und Spalte j von M = A ⊗ B berechnet sich als
Mij = max{Ail + Blj}

Dabei sind die Matrizen A und B in der Eingabe durch ein Semikolon und ein Leerzeichen getrennt.
A,B = line.split("; ")


Die Zeilen der Matrizen stehen nebeneinander und sind jeweils durch ein Komma und ein Leerzeichen getrennt. Die einzelnen Einträge sind durch ein Leerzeichen getrennt.

Die Ausgabe soll im gleichen Format ausgegeben werden, wie die Eingabe.

Code: Alles auswählen

#!/usr/bin/env python3
from sys import stdin

for line in stdin:
	A,B = line.split("; ")
	n=len(A)
	m=len(B)
	result =""
	for i in range(n):
		for j in range(m):
			result=max((A[i]+B[j]))+result
	print(result)
Das wäre mein erster Ansatz, der aber noch überhaupt nicht das ausrechnet was ich will.^^

Ich müsste die Eingabe als eine nested list auffassen, denke ich aber wie mach ich das?

z.B. A= 1 2 3 4, 3 4 5 6 B= 2 4 5 7, 3 4 5 6 (dabei sind A,B durch semikolon getrennt)
Ich müsste A ab dem Komma trennen. => A=[[1 2 3 4],[3 4 5 6]]
Wenn ich das hinkriege könnte ich damit weiterrechnen.
Ich rechne dann z.B. Für die Matrix-Plus-Algebra 1. Eintrag 1. Zeile 1. Spalte max{ A[0][0]+B[0][0],A[0][1]+B[1][0]}

Allerdings weiß ich nicht recht wie ich das in Python umsetzen soll :x
BlackJack

@Immortalmemo: Du weisst wie man eine Zeichenkette an Semikolons trennt, bekommst es dann aber nicht hin eine Zeichenkette an Kommas zu trennen?

Des weiteren trennt Dein Code die ”Zahlen” gar nicht und wandelt die Zeichenketten mit den Ziffernfolgen auch gar nicht in *Zahlen* um, was Du zum Rechnen mit Zahlen letztendlich benötigst.

Trenn das ganze am besten in Funktionen auf die jeweils ein Teilproblem unabhängig vom Rest des Programms lösen. Also zum Beispiel in Eingabe lesen/in einer verschachtelte Liste mit Zahlen umwandeln. Das addieren von zwei solcher verschachtelten Listen. Und dann am Ende das Umwandeln des Ergebnis wieder in einer entsprechende Liste.

Ansonsten wäre vielleicht auch Numpy zu empfehlen wenn man mit Matrizen rechnen möchte. Da gibt es auch Funktionen zum laden und Speichern von Textdateien mit Zahlen.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ist das eine Übungsaufgabe um Programmieren zu lernen oder bist Du eher an der Mathematik interessiert? Im letzteren Fall kannst Du mit Numpy eine Matrix aus einer csv-Datei mit numpy.readtxt (http://docs.scipy.org/doc/numpy/referen ... py.loadtxt) in einem Einzeiler einlesen und Matrix-Algebra geht mit Numpy ohne Schleifen.
a fool with a tool is still a fool, www.magben.de, YouTube
Immortalmemo
User
Beiträge: 13
Registriert: Mittwoch 22. Oktober 2014, 00:02
Wohnort: Berlin

Wir dürfen leider kein numpy benutzen. Hatten bisher nur Strings und Listen und müssen mit denen arbeiten. Also eher eine Aufgabe zum Programmieren üben. Danke trotzdem für den hinweis :)
Immortalmemo
User
Beiträge: 13
Registriert: Mittwoch 22. Oktober 2014, 00:02
Wohnort: Berlin

Ich zerbreche mir schon seit gestern den Kopf, aber ich kriege einfach den Anfang nicht hin.

Code: Alles auswählen

for line in stdin:
	A,B=(str(word) for word in line.split(";"))
	A=A.split(",")
	B=B.split(",")
	print(A,B)
Wenn ich z.B. 1 2, 3 4; 4 5, 7 8 eingebe bekomme ich.
['1 2', ' 3 4'] [' 4 5', ' 7 8\n' ]

Wie bekomme ich das hin, dass A und B als nested Liste aufgefasst werden? Also als Ausgabe:
[[1 2][ 3 4]] [[4 5][7 8]]

Bei nested Listen wüsste ich wie ich die Matrix-PlusAlgebra ausrechnen könnte. Und Arrays hatten wir noch nicht.
BlackJack

@Immortalmemo: Du hast die beiden Matrizen getrennt, und die Zeilen einer Matrize, aber halt noch nicht die ”Zahlen” in einer Zeile. Und in Zahlen müsstest Du die Elemente auf unterster Ebene auch noch umwandeln, denn mit Zeichenketten kann man nicht Rechnen.

Dafür ist der ``str(word)``-Aufruf sinnfrei. Wenn man eine Zeichenkette in mehrere Teile aufteilt, dann sind die Teil*zeichenketten* natürlich bereits Zeichenketten. Was hattest Du Dir von dem Aufruf denn als Effekt versprochen? Der gesamte Generatorausdruck ist in der Form ein wenig fragwürdig.
Immortalmemo
User
Beiträge: 13
Registriert: Mittwoch 22. Oktober 2014, 00:02
Wohnort: Berlin

Ich hatte den Ausdruck str(word)... benutzt, da es einer von den wenigen Ausdrücken war, die wir bisher hatten.

Ansonsten hatten wir noch: A,B=line.split()

Wie trenne ich denn die Zahlen dann noch?
Etwa so:

Code: Alles auswählen

for i in range(len(A)):
Aij=A[i].split
Wenn ich das ausdrucken lasse gibt er mir bei meinem Beispiel: A= 1 2, 3 4 ['3','4'] aus. Ich möchte ja aber ['1','2']['3','4'] haben. Ganz zum Schluss soll es halt [['1','2']['3','4']] sein.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Schreibe doch mal Schritt für Schritt (in Worten) auf, wie du deinen Beispielstring zerlegen würdest. Und zu jedem Schritt schreibst du dann auf, wie das Zwischenergebnis aussieht. Zum Beispiel:

1. Aufteilen der Eingabe in einzelne Matrizen mittels Teilung am Semikolon:

Code: Alles auswählen

"1 2, 3 4; 4 5, 7 8"
-> "1 2, 3 4" und
   "4 5, 7 8
2. ...
Das Leben ist wie ein Tennisball.
Antworten