Rechnerübung2

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Rechnerübung2
Hi,
in der Datei Matrix.cpp müssen wir den Operator += überladen. Aber in der gelieferten main.cpp steht jedoch Vector a(argv[3]); Vector b(argv[4]); Matrix c =a + b;
Und das wird sicherlich nicht kompeliert!

ich habe das als

    Vector a(argv[3]);
     Vector b(argv[4]);
      a += b;

geändert. wurde es in main.cpp auch so gemeint oder wie???


In welcher Zeile steht das? In meine main.cpp steht:
97: Matrix a(argv[3]);
98: Matrix b(argv[4]);
99: Matrix c = a + b;

Was aber lustig ist Zeile 100, wo a.saveToFile(argv[2]); nicht die richtige Matrize speichert!


Zeile 99.
Es wird alles richtig abgespeichert, aber die haben anscheinend a+= b gemeint und nicht Matrix c = a + b; weil wir ja den Operator += überladen sollen und nicht den Operator +.


Wenn ihr [m]compound assignment operators[/m] (+= -= *= etc.) implementiert, dann könnt ihr diese ja auch mit wenig Aufwand für [m]binary operators[/m] (+ - * etc.) verwenden.

Foo operator+(const Foo& lhs, const Foo& rhs) {
    Foo result(lhs);
    result += rhs;
    return result;
}

Ist ja klar, dass man es umschreiben kann. Aber die Frage ist ob es in der Aufgabe gefragt wird??? Ist in main.cpp Fehler drin oder sollte es so sein?? Wir können ja nicht programmieren was wir wollen, sondern nur das, was gefragt wird…


Genau das ist schon implementiert, d.h. das vorgegebene und in der main getestete + funktioniert nur, wenn du dein += richtig implementiert hast (und nur das brauchst du zu machen).

Tatsächlich verwirrend ist aber, wie schon angemerkt wurde, dass an zwei Stellen in der main a gespeichert wird statt c, also einer der Operanden statt das Ergebnis… ^^


toll ist auch, dass die Aufgaben 1c und 1d in der main.cpp vertauscht sind :rolleyes:


was passiert eigtl. wenn die 0.zeile einer Matrix nur null-einträge hat?
verweise der row_ptr weiterhin auf col_ind 0 und col_ind auf -1?

können wir das uns einfach selber überlegen oder gibt es da eine gewisse “regelung” dafür???


Das ist kein Spezialfall: rowPtr fängt dann einfach mit [m][0, 0, …][/m] an. Die Einträge sind ja nichts anderes als Start- und Endindex fürs colIdx- und val-Array. D.h. die (nicht vorhandenen) Elemente in der nullten Zeile stehen dann eben an den Indizes i mit
[m]rowPtr[0] <= i < rowPtr[0+1][/m], also [m]0 <= i < 0[/m]
Das sind aber halt offensichtlich keine :slight_smile:


die manhattan-norm ist einfach die summe aller elemente oder ? ^^


Die Summe der Beträge aller Elemente :slight_smile:


k :wink:
zeile 135 wird bei der Matrixmultiplikation (2c) auch wieder Matrix a, anstelle vom Ergebnis abgespeichert.
a.saveToFile(argv[2]);


jo, ich hab das einfach geändert.
schon viele fehler in der lösung, find ich.
(von den rechtschreibfehlern mal abgesehen :stuck_out_tongue: )

testcases …
ich hab mal ein testscript geschrieben (müsste passen) …

#!/bin/sh

# testscript for algoks prog 2
# by imhotep

TOTAL_TESTS=10
PASSED_TESTS=0

echo " "
echo "###################################"
echo "    testscript for algoks prog 2"
echo "-= no guarantee for correctness. =-"
echo "###################################"
echo " "

compare() {
	diff "$@"
	if [ $? -eq 0 ]; then
		echo " OK."
		PASSED_TESTS=`expr $PASSED_TESTS + 1`
	else 
		echo " FAILED."	
	fi
}

./mvcrs 1a 1a_check 1a_vec0 1a_vec1 
echo -n "comparing 1a :"
compare 1a_check 1a_res 
 
./mvcrs 1b 1b_check 1b_vec0 1b_vec1
echo -n "comparing 1b :"
compare 1b_check 1b_res 

./mvcrs 1c 1c_check 1c_vec0 
echo -n "comparing 1c :"
compare 1c_check 1c_res 

./mvcrs 1d 1d_check 1d_vec0 
echo -n "comparing 1d :"
compare 1d_check 1d_res 

./mvcrs 2a 2a_check 2a_mat0 2a_mat1 
echo -n "comparing 2a :"
compare 2a_check 2a_res 

./mvcrs 2b 2b_check 2b_mat0 2b_vec0 
echo -n "comparing 2b :"
compare 2b_check 2b_res 

./mvcrs 2c 2c_check 2c_mat0 2c_mat1 
echo -n "comparing 2c :"
compare 2c_check 2c_res 

./mvcrs 3a 3a_check 3a_mat0 
echo -n "comparing 3a :"
compare 3a_check 3a_res 

./mvcrs 3b 3b_check 3b_crs 
echo -n "comparing 3b :"
compare 3b_check 3b_res 

./mvcrs 3c 3c_check 3c_mat0 3c_vec0 
echo -n "comparing 3c :"
compare 3c_check 3c_res 

rm -f *_check

echo " "
echo "$PASSED_TESTS/$TOTAL_TESTS tests passed sucessfully."
echo " "
if [ "$TOTAL_TESTS" = "$PASSED_TESTS" ]; then
	echo "all tests successful."
else 
	echo "not all tests successful. try again :)"
fi
echo " "

www.imhotepnet.de/A02.tar.gz

dateien (inkl. “gepatchter” main.cpp ) im anhang …

danke!

10/10 tests passed sucessfully.

all tests successful.

das fängt ja gut an…


na das freut mich. aber überprüf wie gesagt nochmal selber.
ich hab das auch per hand nochmal gemacht.


das hab ich schon, keine sorge… aber doppelt hält besser :smiley:


hab mal ne frage zum CRS format vom Rechneruebungsblatt:
muesste da im row_ptr als letzte Ziffer eine 10 stehen ?


mein algorithmus sagt:

5
5
9
4 -1.5 -2 2 5 -1 2 3.5 -3
1 4 0 4 1 2 3 0 2
0 2 4 4 7 9

was also falsch ist, ist der anfang:

muss heißen:

5
5
9

und nicht

9
5
5

da ->[quote]
Nach drei ganzen Zahlen (Anzahl der Zeilen n, Anzahl der Spalten m, Anzahl der von Null verschiedenen
Einträgen k )

[/quote]