From 077c6def78942234e9c716061a7fb88bdc0d8624 Mon Sep 17 00:00:00 2001 From: paulusja Date: Wed, 5 Nov 2025 12:05:29 +0100 Subject: [PATCH 01/22] Fix unit tests. --- imageInputTests.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/imageInputTests.c b/imageInputTests.c index c704271..03240ab 100644 --- a/imageInputTests.c +++ b/imageInputTests.c @@ -54,7 +54,7 @@ void test_readImagesReturnsCorrectImageWidth(void) GrayScaleImageSeries *series = NULL; const unsigned short expectedWidth = 10; const char *path = "testFile.info2"; - prepareImageFile(path, 8, expectedWidth, 2, 1); + prepareImageFile(path, expectedWidth, 8, 2, 1); series = readImages(path); TEST_ASSERT_NOT_NULL(series); TEST_ASSERT_NOT_NULL(series->images); @@ -70,7 +70,7 @@ void test_readImagesReturnsCorrectImageHeight(void) GrayScaleImageSeries *series = NULL; const unsigned short expectedHeight = 10; const char *path = "testFile.info2"; - prepareImageFile(path, expectedHeight, 8, 2, 1); + prepareImageFile(path, 8, expectedHeight, 2, 1); series = readImages(path); TEST_ASSERT_NOT_NULL(series); TEST_ASSERT_NOT_NULL(series->images); From b4bc2fae8afb0fc3a3e57bb4e427a30647fff04c Mon Sep 17 00:00:00 2001 From: kachelto100370 Date: Tue, 4 Nov 2025 10:54:11 +0100 Subject: [PATCH 02/22] add Readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..135c0cb --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Projekt 2 für Informatik 2 Praktikum + \ No newline at end of file From 41c164d3b2b1b19b91eaea8f1fda8d3c23452389 Mon Sep 17 00:00:00 2001 From: kachelto100370 Date: Tue, 11 Nov 2025 09:16:22 +0100 Subject: [PATCH 03/22] =?UTF-8?q?kleine=20config=20=C3=A4nderung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..082b194 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "makefile.configureOnOpen": false +} \ No newline at end of file From 0e3f03a03d1ecd7687cc94c91c83ff691df74775 Mon Sep 17 00:00:00 2001 From: Max-R Date: Tue, 11 Nov 2025 09:20:40 +0100 Subject: [PATCH 04/22] Matrix definiert --- .vscode/c_cpp_properties.json | 18 +++++++++++ .vscode/launch.json | 24 ++++++++++++++ .vscode/settings.json | 59 +++++++++++++++++++++++++++++++++++ matrix.h | 6 +++- 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..cb8d469 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "C:/ProgramData/mingw64/mingw64/bin/gcc.exe", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7583c69 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "c:/Users/Max-R/I2Pr/repoKachelto/I2-Pr_neuronalesNetz/info2Praktikum-NeuronalesNetz", + "program": "c:/Users/Max-R/I2Pr/repoKachelto/I2-Pr_neuronalesNetz/info2Praktikum-NeuronalesNetz/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..bb879da --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git a/matrix.h b/matrix.h index cc640d1..3e1b911 100644 --- a/matrix.h +++ b/matrix.h @@ -6,7 +6,11 @@ typedef float MatrixType; // TODO Matrixtyp definieren - +typedef struct{ + unsigned int rows; + unsigned int cols; + MatrixType *data; //Zeiger auf Speicher (Reihen*Spalten) +} Matrix; Matrix createMatrix(unsigned int rows, unsigned int cols); void clearMatrix(Matrix *matrix); From 29b2966c63b69617cf898546a8287198b204cbbc Mon Sep 17 00:00:00 2001 From: kachelto100370 Date: Tue, 11 Nov 2025 09:54:31 +0100 Subject: [PATCH 05/22] defined struct matrix --- matrix.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/matrix.h b/matrix.h index cc640d1..40ac148 100644 --- a/matrix.h +++ b/matrix.h @@ -6,6 +6,11 @@ typedef float MatrixType; // TODO Matrixtyp definieren +typedef struct{ + unsigned int rows; + unsigned int cols; + MatrixType *data; +} Matrix; Matrix createMatrix(unsigned int rows, unsigned int cols); From ec54bdd9513f229a69244b3da43d80b0c0a5f535 Mon Sep 17 00:00:00 2001 From: Max-R Date: Tue, 11 Nov 2025 10:36:11 +0100 Subject: [PATCH 06/22] =?UTF-8?q?create=20Matrix=20gef=C3=BCllt,=20test=20?= =?UTF-8?q?unit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imageInputTests.c | 4 ++-- matrix.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/imageInputTests.c b/imageInputTests.c index c704271..03240ab 100644 --- a/imageInputTests.c +++ b/imageInputTests.c @@ -54,7 +54,7 @@ void test_readImagesReturnsCorrectImageWidth(void) GrayScaleImageSeries *series = NULL; const unsigned short expectedWidth = 10; const char *path = "testFile.info2"; - prepareImageFile(path, 8, expectedWidth, 2, 1); + prepareImageFile(path, expectedWidth, 8, 2, 1); series = readImages(path); TEST_ASSERT_NOT_NULL(series); TEST_ASSERT_NOT_NULL(series->images); @@ -70,7 +70,7 @@ void test_readImagesReturnsCorrectImageHeight(void) GrayScaleImageSeries *series = NULL; const unsigned short expectedHeight = 10; const char *path = "testFile.info2"; - prepareImageFile(path, expectedHeight, 8, 2, 1); + prepareImageFile(path, 8, expectedHeight, 2, 1); series = readImages(path); TEST_ASSERT_NOT_NULL(series); TEST_ASSERT_NOT_NULL(series->images); diff --git a/matrix.c b/matrix.c index ad00628..66a3b4a 100644 --- a/matrix.c +++ b/matrix.c @@ -6,7 +6,9 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) { - + MatrixType*data= malloc(rows*cols*sizeof(MatrixType)); + Matrix newMatrix = {rows,cols,data}; + return newMatrix; } void clearMatrix(Matrix *matrix) From 3de79e2b83420a26b3a7ad0c1f6648623e4f5190 Mon Sep 17 00:00:00 2001 From: Max-R Date: Tue, 11 Nov 2025 11:05:28 +0100 Subject: [PATCH 07/22] =?UTF-8?q?clearMatrix=20f=C3=BCllen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- matrix.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/matrix.c b/matrix.c index 66a3b4a..ac8c915 100644 --- a/matrix.c +++ b/matrix.c @@ -6,13 +6,18 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) { - MatrixType*data= malloc(rows*cols*sizeof(MatrixType)); + MatrixType*data= malloc(rows*cols*sizeof(MatrixType)); //Speicher reservieren Matrix newMatrix = {rows,cols,data}; return newMatrix; } void clearMatrix(Matrix *matrix) { + matrix->data = UNDEFINED_MATRIX_VALUE; //Auf 0 setzen + matrix->rows = UNDEFINED_MATRIX_VALUE; + matrix->cols = UNDEFINED_MATRIX_VALUE; + + free((*matrix).data); //Speicher freigeben } From b271c865cb91cbc56cc486b3192c8d7223dc5840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Schr=C3=B6der?= Date: Tue, 11 Nov 2025 11:08:51 +0100 Subject: [PATCH 08/22] =?UTF-8?q?Aufgabenstellung=20zur=20Matrixfunktion?= =?UTF-8?q?=20add()=20pr=C3=A4zisiert.=20Unittest=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NeuronalesNetz_Aufgabenstellung.pdf | Bin 59384 -> 64661 bytes matrixTests.c | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/NeuronalesNetz_Aufgabenstellung.pdf b/NeuronalesNetz_Aufgabenstellung.pdf index dcb354afea14ad55317e4478b77106e061b75b94..b4c6ce546ac738d0aab89b1d7cac75941e645a4f 100644 GIT binary patch delta 16897 zcmagEb8u$O7d1MuZQC{`wmGqFOzbC^*m+{xwr$(CGqIC9zxVrY-9PWCI#s=UuR3+A z_U`VzdhM4Pu%uV8T2dxZE_Pra8U~;Wf6Sh~<+i#emB@o#YZFA+U)#%Mu!Z}^{3UU) z`;erT>Gcymg*4Li`C+n`*)+PnZLxa>n6krkcXtrk|2+}ej%^aWc)MSKfywy&@pU&6 z$;{%Ff>j&)nsld9de@?y-}AcXu(Nmfx|7m#001-&^jH#!GdsQ-|5@T?_y8Pf_}nvn zyq=K;$L!tpbUwWgag&Ms`1r_~5d4eI1M(J3{5dbY)!p^sI3y_(ZdrAg;?UDYO_FE- zTfOv@Y1`9?U$@)0=i`o+qEpstX#?x;S!_ij?lx-fOUhf^JUES>H>gr}Ay;izz<|Z@ zo<%fNq2S-bj}5%_{RNPmhZI1N3&@x5gu^{e66{q~Kb4X&G%L|p@(Qb1-XWwM-H z9A?@N&n69mP?^Y&%vy<3M~b-+L&ZsI#XOaAX3!jKp1S558^!hX7|{}QUcv9h8C+h0 z!DA=$e(r%x_3_^$0?mJua8Ywl*_-0`}@@ZtptHOKIFP3ktC2@50&0)sP!~vG$3VC#Tq&9z(hv zuCr~rWYuZ~2}h%hIcT25O66|Lhz+uiN>-&m)VR5LW*1fSRFejXtb#S`YAY4jmTqQ> zBoM?ds<+~ASux9~VcmO)p@ZskMRt>SoG+-SJyULu#e?zjLW86ec6URuf>qing*8D< zB5xaPKQvWPB`WaPdu$!xBINM*UsZ?~LjXm6CH>Y59@#AYa1s8)}QP z-*n9lUf}8s<~0{kpOT$WHinD(dUjQ42j#z3+IX@gNMeB+A*jnR3?^ZDKpYBIpvxOu z7j!}`$(C2SL^B@rS2ed@g7nckD!{lM*Ecmjr26acfW3B9T{OI#zU_9$zCBuv=w8m&jV|G?8vm{L70adhI}EI+di2OSGn>Sll@B{R6UQnBd{{MfV=KvVZ)on4k<%AxNva# zid}_<`r&;CC>D_7V?QSm|{7W)No~1Ed1Xo0L zIhgoJTglhDaX+FFr4Zze^JMhq3L<&9*qh$nnAcQ55(_SwWXmj%))J=CgW)AfheZ(T z_=fitp{ytdbzV@0LR|Zv7K9asb$3mh4Eax3Uq4d5!KArvoj!%ek*6$zj=*W1HiIsi(!ik+RSXPL- z&_Ou#>5P~&-|u%)c2w5>;{3=UOZH$st}0_M8_(W@sh*-30b45N3E@x>E5^a|Z0J*I;moq|Z*_ zg)Xfc{tDIv`l3FWs?R#Dq zdla!R-Pkb(J*hvAi}^keo8dq zZnVisMQd$$$a7LzV!0#7teXr2F7X8Z3Qkzt>6j+i9^X)9PL zFv)nb$QKGX`z@FMqyf$6GwPOmwYeenwL+92$YmY~ex?43%W$3z(#%G#X_7E&!l`doU-5qT1*8;NNz zAv`h3@-S^2ySI+r+_JDoWhONsrRmyB4M{>-nL7Chphty&c_)capVOVVNNS2UJVdG1 z>acTQAnwbS<4XthFff}E;~(Pz{$?!e+Ej@@ibOf-L4 zm9i~|8pE)zVOEnHhqU64Y-fKB8a8A3&{~y_uhN>C+gZEuT}?enSm`IKEq2bzZn?|J z2+Cp=x{I8U>M5$1nVAlg>Qi)NRQ%fTg_-aJR;in^*?Mg(T-L>zYR)tRkaxv;Ld~U* z;u=q#{{8*mb_->m8;U;til%>`s_J`=`4lltr>3@0Lq!~|R*N67mKu`uCeyWK{AK4* z)z8V5uPsSl;Aqi=4Ri@biD<@dEF=6%0v%MMGczw-UM-dn$~FUulcZhZT06)vbIc0t1B2fvsdi#M7dIiY*F&N+Cd45#PgY@j+z-x!=h7}=3VzZ6pM|*H&JX-y+B!Anrm*>$ z5wnxHy#oOkE+yr?IPFk%=^={Nc&GvpSG!oFCv+7F_MO_AIAA+GY3l7%I^JK* z*=mT=4eKUJ$6^G4#rQGNujWtW-BKJbTx^4m*tfjvf;LIUXw2#AQ3r2QrGA%H`;!*j zh5OQDv`7r+g-$7&qxBUF6gTGMexKqzjg9a=ko%BqtNz6!V?Wr+?2(?}EKu!i3^ zYw+Znt7n-hT?1k1OV3lxb28-VZK^V`@FTu&yiOX#kAt-Ufye!Uc$)&f&NeZG^HxD= zF1i9|kqmu*0rC^OnPoHE9h;6=SL65+OMC8U$_DjjB3v?xEPre!!z5^yY`JMAGz;x6 z$k^)S4j6S~2BI6AD16Zel2VsK(vo$H`jZevo**I}QD5Xv`sF6l3dDP$0 zxqpCFJCfK7p2BGH%n%4Duz@~spp)PFY0;pCe2){V+{`)Am>@77d7rUp!Bul$Nrn*p znC+ekFjE(wBuG30g7UndRK>9>4$*oZY(AC7+?q3x(4S)~RzTcVmtEfuKE|LW#XgsP zAZf(CF9?AA8EAFNF9{T7v9BD>qW^j0!rX-8Z*Er3uDZ@gmvxt_bcJd7b7PTReWM$0 zfp&%cPA%j^2fwx{;g&wE3)^LKQsv0-fT184z$sbBb)X5h#cJMc0Bw)~I}!*T8Q1$e z&1Re&w}^m}i+MSrKjzP)_Lvn{@vm%mPfi~-V*H2Rj*HSQM@cgLH3t5LZDZV%0cq&L{pJl$vP;$+RZCrO-3A2NtI?Sz zK!K6Kqri<~BU_Dg)e6&sYMvLE?=Hfs%afrFcCz+y4%R$3Rt_bR7hVJ;0(M<*f5=28 z*AP#gVY^f~1vJ@MM=TJ*VWmzjEOXEQE_&8fFX zJ${Mluhdmxef87{cj*P|Ol#_!0D2clC~a-Ym?jRz4J(R3K2d7TVu$(1FOZs20Z4SZ zY)t#I+^6Wd+hE%ehHv7&n~zi!3g20#cRi2N_5xEeEH)`-DhrjV1vD_efY1%O9YWN{4Gg~J;V4|!Qc4Tp(fH|cs8FL8psLkCKi zsXm*F|6L5hCd)^fAw3oHup=Cr1%$$1iDE;NMFkVUD^96Dh{$@N4pi=P@`V{CDPM>~ z9}AN-jUs=>ZIF-&DN5xYc=l;YVmo>0+K?&w<Nc1YWUd$E zhqHud=I5~cM{&K`d}NFb>Y*=X{R9_-P>0ITud}qMhVxszf1!#i`v8j+d$J$S-W4Ig zSE!twrs?cbRCPP=9N*qk6nlJC?6r)k(N<^fM#ZY+J~wbUvVERYm>jjgKhJ7jZdwpO z#)icyph~Dp0G&;q`-*}GK)~)vC{W!^y5u{t%|L;XI|+6729Wg?qSPq#5YFt2TdFSr zc)N}e9WEX6MpMiIyqYF1S68tZCd%)ji~bVmKf6y^P_*!|{p&op{_{gYTc;F|a`T7- zIt>H&6~c?@0(dg*J1PmuK1PWpGt9{$&fXCF=uHv?xG}Y6S*hNUaS^(Xe#uSTWwRR( zI0tr~q@V0j!C!XL*Z{shz)(qh<-#Pu@i57|3j;i>y!)D}x`ib&5_Ay>_I~V};y4k) z_m)g9I@!P3*uCgx)4|k;S>)pRzp*ElxHd<(s$gA4cRDyE1xSq^r#*h1Tes)e9{To& zoSR_*M7e@`m=Fa0M$$aTm0dq6A;&e?f=G8C6Yix9Hew`3?JVqHD4m6iZ2j;boh7Ns zP>nvOK+Fq$Xd4rpFo3X;KgA<=#*oKEwz=fs8nq)lj>V}1cs<*oc`zQdf*O*hft#8P zN5i=LUvOjwlo?YWgho=kE`nxyNhF9got&=#%abcCVZd|RC=$d--OBDp%!(|Y);SOB z;%WMJ9M(Q62(9e$aIK9b!%UmYta&Wo?7til!@T%t%-7Qr%o-{GJsAFZrrt|an{7`~ z93^y+>U13*%hov=`=ZAb0|QqVrJXqBsw`&<@;X>6H7$$djN+ZhiY~b|5dMw(`Ww1IST83K_>x*_xbiG2FRf)t z4YFi0oWQ#;zym{@tq##5RT_LVw%7&e1R4_=hCOw0gf(=-zhqr1`A%ea>-N*98P8Qh z*Z&!I_o5PG_C8bM^}LfZ=B-9{D^kWPANu>VgA-$cc%IO)2t@_s72Y?x`arKOo|L}B z>>WMT7dOOy{>1EB^sRG}zC`8^ShSPv_?b%6VZTLgh4AwN`fnXbju%#zpqdFuC zR`1l2u~m6mF(l~*_o>5X**Yvhl)piZ2?P_v^>kW8ls?C@K5C8)s&O_3M&=;L*Fo{J zWNxjYp{EmZhEB9-!+*su$iZWgxwFl9DeVSx=FoR8;u67w>hsvj+Svwi6F+7W8N`@- zJ+M*IaN4`XlmFm7ppy4qq9_|A0IkB6H;F+n@9>+%3 z)KIxf4|~i1tP`NJ{;qmxHkf1A+@D&CfK)3!EU#~u8*stqun)Iu&#QjDs5qRHrbL=?cwRrC2DUS za68Djxba%_aJgi=0N@CUq0QoG-_iCaKbaG5QF2|3{L&c0!<^TPIw0Z^RGmuW_G$4O zRz6Ml0)_49J+U>t`1Xx}dYk3(Je#PJG{-dl&i3` z3f_meO|ga#ScZ9mF`nQ11%HGK(nd552UAjNsMf%L7$T}vL|qU0Cp+DaBwi?X)hI(y zXpi1CE)KKU`KoWJ6W#$NbV93(o>cGN=)!-B3Yi!zy2WaI3;uGI=JB7p6_8o>-s@qD zjNqI!x=;qBQD(Nl+BQ3>ws%R)Dil5%ndsw@WDuT1=TEzjny(kYyMtAEUQY9kAIL&s zP$YK2iA?CgLDFN_I%b3nQzc=-Y{rVpI_vwQ*iWCJl&v7CxlwuO&X##q$qXOkoW0Pp zx{Tw+;R(Z_>cjd!a@MqGmT(DYzW-Jap7`tCK`96zu8Uj?kwy)TDcr^Euw);wpI~gc za##&Ni7gLq8ty07ulPFsy&-AuTL5bgR_VgPm416(2ZSP+!CYgVf+Q@#u&~B|6T3kq~Hf%gDr~*tFG( zK5_(T(|Eaqucc3VXjl9hqskb#D;K^PZHRVe9v;~R^z+8~U8lmMis!M;eya;r5nKcA zYPu)hsnG57saUGgMh7-x`H_wrR@Srt?+TG4)RG`c%z=&mFxe=sk= z>wLNBa#dO9er_JLzaBP^{TdHnd|MM}I2$-MitEsPAIZf^iOq*Py=z1FJZrams)7ZK zgmPvv3-!!eW8O}O1U+MGId6;Ydxt|Bt@c7<*rr#w%_uUCVy_4Pjp6IAlg2spX`50I z35E?Rsxc+-^zrWU#uN%A&Hbi#i$8B6Jg+;~7jz^O)|EU8sIW>kPtdL*BYW70VID|7 z-mMkRFi!U)X>Pmc@T>=G^7L5Ki|Yh{`|mh*5b|jtO4gv`pw&K-X{gATanhw>UXn;h z>$yj)Vg>TJ;^RM99;pPpOEDGnjUpV$A^TsaM>s8tuu!}rewZof;{iciikPyJG!z~M zz|^!aGkv->^JfpZT7VN^1Zplug34KAJU?IPWLX=&n3P{o{rVRc6{$hr2l@dsCSzyW zkfCk7J{_uag}E+Ks&~IP%B14E=}2-lMb9K)-Mo!kYO6PNbG=KIL(FxS$J{4REA5Je zJ?8Mipq__7Fv-I~JUfvhM9-H9OW23kK)r6L@GZL=ob--{?yAMMTSa$^qY@rB#z}f^ z(x=(xavz!Jz5WV}*LyxPdWZlhry9niao3#{6^c8!^pi8oy@wVU%@?jsJy=1ngwtd{ z#_H{w7_8SXx<$JBEQSH6pg;fURN)QJxK^u2f>P#yXiZ9*N$hhgARHK}4o8yyLRdh% zrc)Z&OdOTw+YqK5AKvE0!lv+Oceh@+An~$p3rLn~cSRGu8nQZR+pq*w*N)_Q%gBsX z;bU@8{ei-T`n;7N*RfJLoL%R&hoI=oO3Je$ShLe%a&d6dqedN`2f6&ZK%A_hqw5r` z)OD{xRnv5m$doGoE+)NhD_y1^4+0P23`6|(KW;|EF_1+CL^FN<$ZyLfWEfR#$af~= zd34YtxAGQn299JT?BxSejel&Fn%TZ6ky&`eISn(x25ufGkK6qWy-@;UQxBp(McQ4t zB7*jNt$4Fw^03Ie_O5xa#SeH+N$MMjWTUOKpNe>Dx7>O1Xl+WgKjjkFPyaxE=j26W zDWz$fPIeIZ#l0uG-YBCV++RgIe6q89ROSXYk)QcRxi@^exbiRm$q(g4r3`D(?KWzf zi&>!EC7&AlehsDWEUiBoh1Q_%6vSL?Of5?474gq&yBo-?$ySsoztjn2l7>i7<UsXAt1Iy3qkRIBzd-e}%QxdSJ-2E-6C8P##wrUCA+5*o=(0y(1~=$`(d}=!r74 zw^wN&N)qXqDZ5k`a1ZnUE>F>OH!w}Yk&80*tZR4oW=m4{tKmbK^?pY3N;@xSyl7=) zpdf@{no*PxrQfprG#fS2GcE7eYwl;(H!kAyWRR9c{lWs5u~4`IE?WKsXJzH!`9F+E zdn|^G3%=`FV-cxQBHyi-dDg5Y=rFm^p)a#uj}_XS@%2*)u1S6EI-8=eci|{OEPnBT zbl&IHd2hlU3H19UQZsQrO14L{CN1P>1qq3WDD`eTojcDnO0?gJa^9Unlfd)&6H0R$ zAovmXEr7WnJMVRjP9Ga#MKdsHunjmEb$EF-+LQBY`9M4I(@a#JNzRFfor!Wf zPLc?mwE0W>!LiwXw2(6~J*w!Sv*2{)&x1ph>aI+qY?!!Z)dM}z>VLFwGeHzE)ACot z^gt>#0KOgBO8)t{#7imGMJ4vJbU7u|9SbZHxiu8i&GWTjk}Dm?0n5feKp8MG5qgvY zc4B>`oB6k9Pq+V88IE9EgdpAqyYB{6&||6YI zJ6AM!Kiwc^)JM4UOJ^D_v=GBYe7Qt-G*0Pujn|KUlVBnz4pRR?i|- zohc(D>~YE9ec%VoVa5dOJ(S9YqfcnfvmbE~9p$5yZVZS6#o&>D>6ri{gLNZi<3#nQ zCvJ5|RtmZk7H3j^t-tKXV%BmGev5x9;LBC8Uhb*<2@%e**jJtqqi~vOz+H|Y-sew` zAoJQIM|)-{dAA&;?!1PNj+fg2?FaemB0$hdl4W2zdnrUf5K7ik%!hU=@|MNx3W7f$ zfPO1PSPliV9jGK?En)^p4$397>x$I{!}x6(hix@qSKxKmP1f`y^)%V5fcCr%GnV5l6nxk%BF!dT(|noo1VbdKHlh=TUcHm?l2@B|JmQ8QqdC zmpq(_s;NR0Rp7PnVGWaalD*{ee9ZNIENNjonLhQGD0^c0Q>i$B^CQ<8I2m2**v%{V zMXTkU_qn)=KF5Usn;XVjVU$5GQC}*=yVFW(oG=-!m@EWUlxZpx4P~}Dm)^H#M|@Nr zM~We8p!?z240BPg2Bm+1IP?h>sRH3(UXQ|NHA2qJV|kgX8ymRRfyS5Z(GiJHp#QFG zuEo8q)GLWB@g)z~KGVfNR!BreMJj-M7N;!Y6g9)KB1_PvV=g~{Ry`_JD8h9u-%UuI zj;TT^bT)m`701Ppp_QRoa{Xp(Gs4_sm9ooTC?Vc3cj!KTKDmOPjh0s?j)u}c9NOZ9*;6BdmQWAR_ed=b7P`!=gP?-A?-v}N=? zXdUQ{-{tcWOuKgyc|@FfZ0#$=+Sm`-bfDBo`y!h(p)64vjl<4o?s_h&%{Xr{3+WVR z<$&9Z_=N-f2X`wL@_Wr4;I*-W6(r{@F;jMf#}&$hHv(y3uE6*h3vJg5v6~;^KDdUgNiu^KcycNiJ415dk2xDQZ?+LJ7)%i8NMQT>*7iu!NKQdjo})vglAy(L)>MI%)g8#$qg^GXWvH;U z*^mF}Aw8NDg6_}6@z|v34rx5&vnuUuE+@UO_>@kBPYJLQ)Z9_f;#bltkoU4oPW}Zo z?#Thz0;NeEu$o;{@FQ=H>IH=h*B8k8`f zm@weOVRa`f6O~I^fX?6}ZFQ4^t<|#JskLwangt?%>!IiBxC&>hA?pqUwc#l=ED!=m zbMwcKOXKYQ7r&;cMzA%UH^a?JrNscKEua=4A8aTBh<^J8`s)Hf*iiKQwBrc7fx<%M zldZFoT@J_~B|^O+I>=JY6lfo`vae&_yExHFNb%!!Ik`6Tc4?UN9pE7Dol zbX<^di!^s?j9vZ2dRdLrBfrXw5*|g-$od0^`V=X%5&d?r5>xGSh{|F7nDy#?QoIBk z3+VlPeO0Acw!ybwk>?FojV_5BY*4L@L$6cq7uru<1=5?2Ywnw&{W3e~)MY0Cd4fi9 zGzZ9o+0zYA=`<>O<;U&o;!I$Yzm1D&0YQtydy)`dJLdQ82LF+;QUs0Mt^`YS{}l#Z zlYIx*?*cx}L>dHhzV&F^M3I+S!HZ;LM+Ax?qcYod986p$h?X|xJk;Qn@Bq^Y9QzMt zDIaGt?-DdC#!#4id3{VbL}3AdK;h&T5(r}9NTl!FG=il5J&eIkc&htZ03zi5`d5-ocQ@%V1upaA3trk7wDIw>9-^qOr-FQ6-2<}sveQKicG0ACva)Hp=;f^T1zmQ-k6ZQ zLi^1co@boo`|6)g4_}<$)_JTEc}wZep8+;#DX(T`qAKrDLO7F3bM=V5P@eF)$9p3F zhg$-)F}4&}2T-|)^~0lJ*0n&KAmf17ovu<5a8%e20Ku+FyaWC|LIYj`Xh2ywfrb#6 zh$e>E*uCJS*jhh+0DnOL&kM@J4g9JQ1mkAs1n$sd0DM(-CiH`Cgfn)Krfoohk<|o#3YE>Z)dR>w{F`C{lJB znxHgJ3m}n%fS2%4XC(%h_}?R&477n~3mfa;HmiE1OK(go`9_`TXk1eRf1a7xOVIj4 z3dhw@;yivH)=W+2cuA@;vqcL>q={?JLnqXt!HsGi%G4)T5?272x^ZM!sbCHBoYxY} z#EtE`1|dXYH4}Rr;|KCqK#`Ftm=z!eS9^1V0MYtff0u%q6qNdx{|xc+Ofvj9QcxC@F4ffA)B`eFRTV^1A9-qjO1aZsv?Zw985L;=z@A06_I zL71?f^&u!McLJ0GT==(I5mu|XFbH8aBrGd9B2*j+IEi?f-nA1=e6DI@V6{JDyxs>= z6yTE867hMMwPv89+fq;Kh_|F(66g6S6n5ga{vK=Z!?a_T>223b5FK5ijOyVKsuaaK zYMyK*Hk=t}FC(mJ(8j5OGZjZd+J{8C-0oY&V`Y)NaZ;G7X7$!iR^y@6a$|SQ;faLT zk|#Dh*L&;X+b%iF@&+FdK3&b7o}W$E9q`&FQ|75>t)cj&m!y5GTt%pVzxD<~wb+l( z-e@Exdr?@GBUxhr2q2tix`$$yDflYa?sL6t^Ek7$XhC>f%sSBVauAT!6>XV4fTk6) zJ&4)*P@tA*A&Adcc49Y}EMAgwEW0yv#; zqGF0b5Ev<83Z14D9+^hS=`hJ`0WtiGwO)$h@Esba)fNDj%v*EHkYrPm| zIb}j9|L7)oT2kfVxVuL75Ted@2iZiUy*v-PvWyoRn{#8Om@Tl{G30iZQ$p}*3BIKj zoLms7;?6B)6WaKBCjYLC9?m|^rDB0=Kmn&{VSaI;fR0;1H2URa4(peKcGfF?Rql_v zWj^J;XiRr|$9NpeX%1>k`6PeJy^I@~Wf{#Tw=>xNQl@FchZ#AtVJrt}%-RF?Fm1i| zzg6~6i}}~W2FAw4^4}thR*|>q7eep6sqx^4_6pNNxDqBe{GR}J(5O<1upuVj#89&a@8aTD~dN;G^~}dEuYk+_hlevflwfIn1%U%gjWHRamtB zl%V5VEZLOUjN}^6l6qhgK!za%62pHA>ChB-&ssT8pABhFT(}6+?p0Isi3@*v-oEMb(6e@NRqlkQa#oD5Igid7-}Wca6d}#}*d~=;w9_k| z+JRVD!JP9Q`se~yu7(Yk*XWOleXGorMExHCRM)K#!zSvva)Etkl6z<$E$ z(TFktGO4hZ?3rTPDBM_mNH|ZVsU9u)+H%Qr$L=9q2MQ~OXCBOasZg4l(8<_w<-ELQ z4&2X*Xu4=O_iVQOsA4hEo*=Y*FW6ws>`k3roXm{uV9kKOM^Hd&APp!h>;HB|bdy~* zLu2g4+<*YHTApx(A0c=@+W(6hEAX>I2%LrW-|qQ81{1PyZMCgVcn39)W^u=dxG-}&vWLEXODA&sA_O9y8OZsN0q}O z=Q3Z*0)WIjIK)2^D;P5LvX1lqI&O#LSoHi?p#UO%NwSJHPL&gcb(?~3qmp;%($Q-F zyM@e6Z4m_^rTR_JKtlOJL|T8_yL8bdz&Eh;O=GR(F1y1P!i+xGvOIHLNMly#46;4V z@BO>t=2(0T4_PV6ZXq(m8mzDO)YaRx@%FVm8lX-Wzf{UVoPT86m=Jw;Ryx*Az%y{l zfmiN+c@M!$k>d`wZYIi5zdH2(>>BJlO453lt*0Ma`w_DYQ?a%}a{wGd&69DjF8p0f^i4 zWlVysS8VFy3k^r-8pAYUW4Z$|SiMkDJKP{EhF|OrF8!x5gw^{#egkqoAWnxm{%O=E z!?8!T43cQ=fa=*U3+4}5hdD#d;({wipWTeM=AQ-HY%bT70>4#D5O=8<%JjpW_?gke z2`|f$Zk$Ar^Gl3CS?f&S&?xUW01#0R1r{Wbuu((`t^wdsB6CU}>fHB)%<0lPRs2;| z4f<8@bv~fg)GH2@1Z-D1{qS-M*?e4nd#fu#`Qv{xFi(jtiEs^{EUVrEnBfUe*KORd zk$MTaJun#ilbl;k|B0&WM{D>#U?W_@f+owUNjX#5Sv~RXF&9i{zhcKV0RlJNIG9B- z$WWoEpJ&&xys@tS8Nb=Bjiwf9XC|Hh4yD}`0|*He@k3Q7&2}yc>1xy-p70@dRhaQ* zGbg`Xtytltv7zSO>Zm-(J2gxYyWnova9zE>@weY7zRa@O4w_zqHrj_Yt~GQF$MP`$N{5O*Yn1y@6!+)?If9UI0RhzBEOD;()9j@q3qz|bg zRRA9CI&U9RXby^N_S{kONh|>hOH6N7ORx*Koam|$`~doX4I~R?WH$$ zLSOhM^`)x4ziXWr;>aNwQ_teR8`h6c1~XJ`Y8j98L8P!%Xr?wyzT9Ek9&48dO2el>Wx{1O=H;vQG_w}@AtjAF ze^YC+JRCW!rwM48FFOG0uMYnA(ngDuWO=K%RL@`FiBOHumekZ_&WY{V`wPbX1k{VhW|Y^BJ6w>~x!}QxV9xU2 zv^^iP+=6PM%W!uvrv#rU|BDvztds`mK8X*UbD#iaWBy;k-oWM9gapd=UynxvhQAmn zPbJxLLio%KIIZE_DPC_CGKe$+B+ zP*C>&u)v}U4N!LOhOY`;0uc89RW1!dV-ujD9REXFf^hurRBU*iyoUtk_%DkZFcxP( zfF7&(h%C&^#7q)aPR=gG+?=eyyj3DF7ViJkesZO&rHapk>UW}XI=8J=?n;Cg6aK@N znN2|RuZKmHr)6%GcgY!Ld*rPL;M0$0X>JM2EGCR6EVshNv{izA|2MhMOKrBX1R#FnPoD} zN=1RfQbG|H$F8(YVr45t;*9ymGYi~Cd_WF^`(nQ%eD>#~$SVoOzrnZ%6`yBAMInZ# z^#&;dOPF6rVEP@3?4Vqv6jm6*94iRM5Af;T^1?JUq(g@Tbr0fu!I$K(>+PmSoVU$o z?=2iGfe#YM#znyVP{MSBMr8=~f3k|>MxWc9k0Z&$M-@YOhedR|cnJ}5bxaPysN!v8 z;$G!9g(e|}oq~ySBc_8x36?2mBVSUAIHZdSAb*t*4kZ7*+=f6RogL~rN<+Lh58zHP zEu|qZLboE5b~6??2o9yjJL*+nkJ_a~6_-o*QH+N(F64q&gCtcJ8z)$m%1^*{%F7E2 z4C-?a_iu+$1O;)GD1g)Upe0j*%juPZyE4+i75zxuMjo^#cO4Te35}ff#};KRML96k z0$Y-cb1B+K9kG$}67CV?^?VfOw&F2Y1?aRL#I<@u5M$0iYHG0cJwzwI(5f|XK7|D4Xu$tcIP*>XOGxc#x#EM({ z>Crt=`r*L*b#du~rS*I!dtd)WdoXj%w~O)(VEXt*8U9B3cE<-SS$!Zp#^~^~eW)qx zjhMq=q3!Gw$a=JMk5neR12XZJ!`{@nGSHSh&EwMg0#}z9=f~J0#vThyK86THP3Il? z_V{>*3rrgE$?EscKIT}iH(0LgCpF2=XZT)A<)p|4*>Wkj0`W`koD}8Siw|4=>+i&EiAVI zFP{l7&F=HWK!CY|4F&(c-wf8a;9{?K&N5(C%=kpa965&!P2RZWc+9xb|!_7VHJFwdrChHBAG^gc8WlZ)1#;P4fG&m}T zvIFH{+D?)KJydiGZD&bR{WZ97V8xT@>`I0=vS$9a)xGToAZ0%3`x1k8-)%CW=R0!i z@HY$dH;gS`yp}}=3b0^q55Q%7#mbv@BUafpUHOY3ylSHJtTcoZb#TkF2$;rJPsU;# zcTAu*EPC;&7|wPraIvpfGWhOf(}P^o*`B2H+$>SR0v@tH5u2vCo-@f#R7M@AIDIeO zmU`NCdG+iDFy1V#3Ku;;VgV6x>MN{ID|A;Dk#NwHB4E8nHzgG_$iYNj_vXO06cmbbo-1^e%1{1S-Ej`U-Ab>G=SYaa{1SZ>jo+Z zPeQCkuX<=Ix5f+(n<-?(4B|5H5-iOISWLSnRz{5iPSuj$|MbzWIP@I|7|rVDjw}t8 zRE!PL{H#{9Pkx%f3{))kbg2fI?$f9VzLsVV&G-)DKJe(hxzL;@ESM>kNVvRG=?OSZ zo%#I&Dx5mWrx;w+U$o~N)o|BbB;2ppmk(@G7pTu&$o784t8ytU9VB>R!!p@v3Z;7&u?bF?q_(9ySovA=k@) zuCcpo1D`CU1&5-X+N-Or)78`a2wFmIT4(Pv+R2~Z0W2NW1?F`H8?KU}O*w~f=SOzV z?B#MDTB}t-gD##q*M?!P<$uK0+)`YABccuf+BswPN?aMByH^J#?emKrY}hfH2Jt#t z)G`iKugpI=5s3{Z>pM$}3>r_ulXsDvyR4D?Z1mf7^NA2%S>QCS52SllHb)LRGRBD6 zHPY6&6;(g(eY`kvbTJO3$9v8U@{gB7kp%6oe4on=;3aBqdj)X1uCa2sknSTdjB=;} zp`UPk98}3yjX&1VA9$~d_roC4O|c6oyQ83r0lK{L)!A61yn!Q)&L5^;?P_jJ`P@5 zHKHmcOkAXvTxBf)LFA+L81=9iR)w{fi}Pe1!JbXehR0CHiP~YhB75(mU(ZKLTsVel8tWALG*eYw zcf%~H_cAm#HHrHqohlMLL2UC#UnM$PRpXa1z9dQ%2o4Di4`#}xHg*H{^0KuyV%%%w zCq+fZOxCb9$*M2uqyfchku-dO!MxxoztRQ2*11xFQbgcLk1oKqn9s3_me62 z8vP!^*kO@vf59q_T`F+rTeu%6=Dk=A4X0pQK?26wDCmZFNq<#+5dHSHcU#I2WF1Qm zQ8#IRdv8{;zwzz*fN?)N`pW|O+meEBtOw|7lcYr=LE}}s$zyV5n?l3@+y~>8(E$+a zsChEt&4+?{{CuRz@u>oy@$sY*$Y?+q{rJ@j$}<}j;YE2#7b_{@1ZWrXTqFb9Zg57) z@=+Y2A{Sj52uUJ5@pbIiMw{NmLszhQq?>2`O9DeVq>+?Q6i5!9cNt=cW*UCqa^q9D z_)?{4^6}~@lffmCdCFRVrV$Km&2WO9iFDd~|NMA2(?Ehj2!*>1eO2>2esW@UUEyMo zVR+{1KoWeuYB*IaNL@XQ{$ZHo&o|HYNNF_`^gmUnLHZH;CKQFXK-h9^J5cwMHVPzaM)Xm8rmZ_Fl-kV1w`P&2tBlo11y(U5FYJWtsdu>U0?mZ%Ya2*)oJp_j#UbWz3?NJ)PLj zhWhAvHd7irV6t8w+4o&Oj>9}B2Pypu$&S!=s{(<)C$;g>sA5DUxZO!@{6ankTT)NN z+KUg3gS8+LTcWB`w1icDv~s?>xH|h{a8jk=eR-^-;EL$Uuk`BF-pN2rn>)YAb%v{k z;|liq(dJ2Rax*);t%V=B#BXriJ>e!hdF3vBqSX1>2`dqyB&oG07Jr@qEhcFUsPLT!?xv&U7o z&Z1_4ql?hEzyAgq>gE5BQh{=^Hk>SdgFv(Vdze{Rc!1X{c>kY)vT6aw!odynT*ZUq z{C_FUKc@7L(SUNX{YRPYfD_gO%*f);pAlNa!Hc*$2@KEyvr5#B(q|@W^~`66@Zki; zMU8+R<&RR*`un!cHr(i8YGm+Kd{!6prYE(wA zV2{3>{C6Lkm|r?6b9?dKdY3rr4<>6gGweCu(!=n=lpW~{Df@sV75?P$NR?l{i=wW! zSF3}neg3I#E<2g4yi20T<*TZ2Im}v|8)q2|F`S@lM{|0E1sDXJZ+rrC-~>ZB^)$$uQXE>B%6=Ei7dvk|>7VH1D#Qq`qm^qnQxjETHCB)d6 z#l%E-csPZ*{@wXXu(5J-a7r+X3;h2;ApgVY0dFk{|Iy_wdMp6JERUj^GWyVM({>c= znJA?2PyiHlAX+|kK6elpHytcuQJpGUlQJ$X9&ly8G(c0w>JZHG1CrcjaC|t`(Dn01 zUG6iOLoo<5GKd-NY2WzM5#h>t}K^H80INqEtmQG z{|PMt(*E?U)I$FeJtws#f6kVp=cSIsx#{Qy=er}Toc|NK#)WT@Yo!uY-1Oq0y!b_4YL5AB+`*)m ytL5eA@=9g@JxqJG5tTldMh02`ot6J3`VZ3QQN)wb=Nt?+GdVdq3MC~)PeuxlXYyPC delta 12113 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 X_awhJL_`j5E)EWON=k7>3Hbj5qr;Gr diff --git a/matrixTests.c b/matrixTests.c index 686db1e..80b1daa 100644 --- a/matrixTests.c +++ b/matrixTests.c @@ -71,6 +71,32 @@ void test_addFailsOnDifferentInputDimensions(void) TEST_ASSERT_EQUAL_UINT32(0, result.cols); } +void test_addSupportsBroadcasting(void) +{ + MatrixType buffer1[] = {1, 2, 3, 4, 5, 6}; + MatrixType buffer2[] = {7, 8}; + Matrix matrix1 = {.rows=2, .cols=3, .buffer=buffer1}; + Matrix matrix2 = {.rows=2, .cols=1, .buffer=buffer2}; + + Matrix result1 = add(matrix1, matrix2); + Matrix result2 = add(matrix2, matrix1); + + float expectedResults[] = {8, 9, 10, 12, 13, 14}; + + TEST_ASSERT_EQUAL_UINT32(matrix1.rows, result1.rows); + TEST_ASSERT_EQUAL_UINT32(matrix1.cols, result1.cols); + TEST_ASSERT_EQUAL_UINT32(matrix1.rows, result2.rows); + TEST_ASSERT_EQUAL_UINT32(matrix1.cols, result2.cols); + + TEST_ASSERT_EQUAL_INT(sizeof(expectedResults)/sizeof(expectedResults[0]), result1.rows * result1.cols); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(expectedResults, result1.buffer, result1.cols * result1.rows); + TEST_ASSERT_EQUAL_INT(sizeof(expectedResults)/sizeof(expectedResults[0]), result2.rows * result2.cols); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(expectedResults, result2.buffer, result2.cols * result2.rows); + + free(result1.buffer); + free(result2.buffer); +} + void test_multiplyReturnsCorrectResults(void) { MatrixType buffer1[] = {1, 2, 3, 4, 5, 6}; @@ -159,6 +185,7 @@ int main() RUN_TEST(test_clearMatrixSetsMembersToNull); RUN_TEST(test_addReturnsCorrectResult); RUN_TEST(test_addFailsOnDifferentInputDimensions); + RUN_TEST(test_addSupportsBroadcasting); RUN_TEST(test_multiplyReturnsCorrectResults); RUN_TEST(test_multiplyFailsOnWrongInputDimensions); RUN_TEST(test_getMatrixAtReturnsCorrectResult); From 28944bd87107bd77bcac432cf08f28cb44c88bcb Mon Sep 17 00:00:00 2001 From: kachelto100370 Date: Tue, 11 Nov 2025 11:15:40 +0100 Subject: [PATCH 09/22] added createMatrix() + matrix data type --- matrix.c | 5 +++-- matrix.h | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/matrix.c b/matrix.c index ad00628..f1a06f3 100644 --- a/matrix.c +++ b/matrix.c @@ -6,12 +6,13 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) { - + MatrixType* data = malloc(rows * cols * sizeof(MatrixType)); + Matrix newMatrix = {rows, cols, data}; + return newMatrix; } void clearMatrix(Matrix *matrix) { - } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) diff --git a/matrix.h b/matrix.h index 40ac148..736e6e1 100644 --- a/matrix.h +++ b/matrix.h @@ -6,7 +6,8 @@ typedef float MatrixType; // TODO Matrixtyp definieren -typedef struct{ +typedef struct +{ unsigned int rows; unsigned int cols; MatrixType *data; From 3c49920613c589218775af6e52cd596f3314b3e4 Mon Sep 17 00:00:00 2001 From: Kristin Date: Thu, 13 Nov 2025 20:28:48 +0100 Subject: [PATCH 10/22] =?UTF-8?q?matrix.c=20und=20matrix.h,=20makefile=20f?= =?UTF-8?q?=C3=BCr=20windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- makefile | 13 +++++++------ matrix.c | 58 +++++++++++++++++++++++++++++--------------------------- matrix.h | 18 +++++++++--------- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/makefile b/makefile index f27b756..67a3c53 100644 --- a/makefile +++ b/makefile @@ -57,10 +57,11 @@ imageInputTests: imageInput.o imageInputTests.c $(unityfolder)/unity.c # -------------------------- # Clean # -------------------------- +#clean: +#ifeq ($(OS),Windows_NT) +# del /f *.o *.exe +#else +# rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests +#endif clean: -ifeq ($(OS),Windows_NT) - del /f *.o *.exe -else - rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests -endif - + rm -f *.o *.exe \ No newline at end of file diff --git a/matrix.c b/matrix.c index f1a06f3..6cd833e 100644 --- a/matrix.c +++ b/matrix.c @@ -1,36 +1,38 @@ +#include "matrix.h" #include #include -#include "matrix.h" - // TODO Matrix-Funktionen implementieren - -Matrix createMatrix(unsigned int rows, unsigned int cols) -{ - MatrixType* data = malloc(rows * cols * sizeof(MatrixType)); - Matrix newMatrix = {rows, cols, data}; - return newMatrix; +/*typedef struct { + unsigned int rows; //Zeilen + unsigned int cols; //Spalten + MatrixType *data; //Zeiger auf Speicherbereich Reihen*Spalten +} Matrix;*/ +Matrix createMatrix(unsigned int rows, unsigned int cols) { + MatrixType *data = + malloc(rows * cols * sizeof(MatrixType)); // Speicher reservieren, malloc + // liefert Zeiger auf Speicher + Matrix newMatrix = {rows, cols, data}; // neue Matrix nach struct + return newMatrix; } - -void clearMatrix(Matrix *matrix) -{ +void clearMatrix(Matrix *matrix) { + matrix->data = UNDEFINED_MATRIX_VALUE; + matrix->rows = UNDEFINED_MATRIX_VALUE; + matrix->cols = UNDEFINED_MATRIX_VALUE; + free((*matrix).data); // Speicher freigeben } - -void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) -{ - +void setMatrixAt(MatrixType value, Matrix matrix, + unsigned int rowIdx, // Kopie der Matrix wird übergeben + unsigned int colIdx) { + matrix.data[rowIdx * matrix.cols + colIdx] = + value; // rowIdx * matrix.cols -> Beginn der Zeile colIdx ->Spalte + // innerhalb der Zeile } - -MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) -{ - +MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, + unsigned int colIdx) { + return 0; } - -Matrix add(const Matrix matrix1, const Matrix matrix2) -{ - +Matrix add(const Matrix matrix1, const Matrix matrix2) { + // broadcasting + return matrix1; } - -Matrix multiply(const Matrix matrix1, const Matrix matrix2) -{ - -} \ No newline at end of file +Matrix multiply(const Matrix matrix1, const Matrix matrix2) { return matrix1; } diff --git a/matrix.h b/matrix.h index 736e6e1..1d37962 100644 --- a/matrix.h +++ b/matrix.h @@ -6,20 +6,20 @@ typedef float MatrixType; // TODO Matrixtyp definieren -typedef struct -{ - unsigned int rows; - unsigned int cols; - MatrixType *data; -} Matrix; +typedef struct { + unsigned int rows; + unsigned int cols; + MatrixType *data; +} Matrix; Matrix createMatrix(unsigned int rows, unsigned int cols); void clearMatrix(Matrix *matrix); -void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx); -MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx); +void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, + unsigned int colIdx); +MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, + unsigned int colIdx); Matrix add(const Matrix matrix1, const Matrix matrix2); Matrix multiply(const Matrix matrix1, const Matrix matrix2); - #endif From fde82f2d9a6de577e27a8bccc25411c1f206fde8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrico=20Schr=C3=B6der?= Date: Mon, 17 Nov 2025 15:07:03 +0100 Subject: [PATCH 11/22] matrixTests korrigiert. --- matrixTests.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrixTests.c b/matrixTests.c index 80b1daa..6d56e7a 100644 --- a/matrixTests.c +++ b/matrixTests.c @@ -164,7 +164,7 @@ void test_setMatrixAtFailsOnIndicesOutOfRange(void) Matrix matrixToTest = {.rows=2, .cols=3, .buffer=buffer}; setMatrixAt(-1, matrixToTest, 2, 3); - TEST_ASSERT_EQUAL_FLOAT_ARRAY(expectedResults, matrixToTest.buffer, matrixToTest.cols * matrixToTest.rows); + TEST_ASSERT_EQUAL_FLOAT_ARRAY(expectedResults, matrixToTest.buffer, sizeof(buffer)/sizeof(MatrixType)); } void setUp(void) { From 0081e8f89e804b5b0f2943e860ade50a3d285439 Mon Sep 17 00:00:00 2001 From: Kristin Date: Tue, 18 Nov 2025 10:11:38 +0100 Subject: [PATCH 12/22] data in buffer --- matrix.c | 25 +++++++++++++++++-------- matrix.h | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/matrix.c b/matrix.c index 6cd833e..3049010 100644 --- a/matrix.c +++ b/matrix.c @@ -5,31 +5,40 @@ /*typedef struct { unsigned int rows; //Zeilen unsigned int cols; //Spalten - MatrixType *data; //Zeiger auf Speicherbereich Reihen*Spalten + MatrixType *buffer; //Zeiger auf Speicherbereich Reihen*Spalten } Matrix;*/ Matrix createMatrix(unsigned int rows, unsigned int cols) { - MatrixType *data = + MatrixType *buffer = malloc(rows * cols * sizeof(MatrixType)); // Speicher reservieren, malloc // liefert Zeiger auf Speicher - Matrix newMatrix = {rows, cols, data}; // neue Matrix nach struct + Matrix newMatrix = {rows, cols, buffer}; // neue Matrix nach struct return newMatrix; } void clearMatrix(Matrix *matrix) { - matrix->data = UNDEFINED_MATRIX_VALUE; + matrix->buffer = UNDEFINED_MATRIX_VALUE; matrix->rows = UNDEFINED_MATRIX_VALUE; matrix->cols = UNDEFINED_MATRIX_VALUE; - free((*matrix).data); // Speicher freigeben + free((*matrix).buffer); // Speicher freigeben } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, // Kopie der Matrix wird übergeben unsigned int colIdx) { - matrix.data[rowIdx * matrix.cols + colIdx] = + + matrix.buffer[rowIdx * matrix.cols + colIdx] = value; // rowIdx * matrix.cols -> Beginn der Zeile colIdx ->Spalte // innerhalb der Zeile } -MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, +MatrixType getMatrixAt(const Matrix matrix, + unsigned int rowIdx, // Kopie der Matrix wird übergeben unsigned int colIdx) { - return 0; + if (rowIdx >= matrix.rows || + colIdx >= matrix.cols) { // Speichergröße nicht überschreiten + return 0; + } + + MatrixType value = matrix.buffer[rowIdx * matrix.cols + colIdx]; + + return value; } Matrix add(const Matrix matrix1, const Matrix matrix2) { // broadcasting diff --git a/matrix.h b/matrix.h index 1d37962..ca871ae 100644 --- a/matrix.h +++ b/matrix.h @@ -9,7 +9,7 @@ typedef float MatrixType; typedef struct { unsigned int rows; unsigned int cols; - MatrixType *data; + MatrixType *buffer; } Matrix; From 619cd95a5c2ee3413f3914c5de6648ed4861c4ca Mon Sep 17 00:00:00 2001 From: kachelto100370 Date: Tue, 18 Nov 2025 10:45:09 +0100 Subject: [PATCH 13/22] start wroking on image Input --- imageInput.c | 9 ++++++++- neuralN_readFiles | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 neuralN_readFiles diff --git a/imageInput.c b/imageInput.c index bb30de1..d31a7da 100644 --- a/imageInput.c +++ b/imageInput.c @@ -7,16 +7,23 @@ #define FILE_HEADER_STRING "__info2_image_file_format__" // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei +GrayScaleImage readImage() +{ + +} // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; - + FILE *file = fopen("mnist_test.info2","rb"); + char headOfFile; + series = malloc(); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { + } \ No newline at end of file diff --git a/neuralN_readFiles b/neuralN_readFiles new file mode 100644 index 0000000..4e29b1f --- /dev/null +++ b/neuralN_readFiles @@ -0,0 +1,29 @@ +Inhalte: Dynamische Speicherverwaltung, Strukturen, Dateien lesen. + +Ziel: Die Bilder aus mnist_test.info 2 auslesen + +Struktur für einlesen des Strings am Anfang der Datei: + int AnzahlBilder + int breiteBilder + int LaengeBilder + +Struktur für Bilder: + unsinged int array Breite * Höhe + unsigned int Klasse (Label 0 - 9) + + +Speicher für Bilder dynamisch allokieren + +GrayScaleImageSeries: + datei einlesen + header String aus der Datei lesen + mit header String den benötigten Speicher freigeben + in den Speicher die Datei einschreiben (mit Hilfsfunktion) + +Hilfsfunktion (saveFile) + gehe zum Anfang des Strings + speicher alles der Reihe nach ein + +clearSeries: + pointer der be malloc kommt nehemen + free() From 858673bdca9a62a32a1cf5ceef28b6dd88c0662d Mon Sep 17 00:00:00 2001 From: Kristin Date: Thu, 20 Nov 2025 14:46:14 +0100 Subject: [PATCH 14/22] =?UTF-8?q?makefile=20f=C3=BCr=20alle=20Betriebssyst?= =?UTF-8?q?eme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- makefile | 3 ++- matrix.c | 28 +++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/makefile b/makefile index 67a3c53..5d94684 100644 --- a/makefile +++ b/makefile @@ -63,5 +63,6 @@ imageInputTests: imageInput.o imageInputTests.c $(unityfolder)/unity.c #else # rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests #endif +# clean für windows clean: - rm -f *.o *.exe \ No newline at end of file + rm -f *.o *.exe \ No newline at end of file diff --git a/matrix.c b/matrix.c index 3049010..7a8dcac 100644 --- a/matrix.c +++ b/matrix.c @@ -20,9 +20,9 @@ void clearMatrix(Matrix *matrix) { matrix->cols = UNDEFINED_MATRIX_VALUE; free((*matrix).buffer); // Speicher freigeben } -void setMatrixAt(MatrixType value, Matrix matrix, - unsigned int rowIdx, // Kopie der Matrix wird übergeben - unsigned int colIdx) { +void setMatrixAt(const MatrixType value, Matrix matrix, + const unsigned int rowIdx, // Kopie der Matrix wird übergeben + const unsigned int colIdx) { matrix.buffer[rowIdx * matrix.cols + colIdx] = value; // rowIdx * matrix.cols -> Beginn der Zeile colIdx ->Spalte @@ -41,7 +41,25 @@ MatrixType getMatrixAt(const Matrix matrix, return value; } Matrix add(const Matrix matrix1, const Matrix matrix2) { - // broadcasting - return matrix1; + + // Ergebnismatrix + Matrix result; + + // Broadcasting nur bei Vektor und Matrix, Fehlermeldung bei zwei unpassender + // Matrix + if (matrix1.rows != matrix2.rows) { + + // check, which one is smaller + // realloc + } + + if (matrix1.cols != matrix2.cols) { + } + + // Speicher reservieren + + // Matrix addieren + + return result; } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { return matrix1; } From 0886489d4942d994fe8d0aa0f7b700090a5aa48a Mon Sep 17 00:00:00 2001 From: Max-R Date: Thu, 20 Nov 2025 16:03:44 +0100 Subject: [PATCH 15/22] Matrix noch ohne broadcasting --- matrix.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/matrix.c b/matrix.c index 7a8dcac..fb44123 100644 --- a/matrix.c +++ b/matrix.c @@ -44,16 +44,38 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) { // Ergebnismatrix Matrix result; + const int cols1 = matrix1.cols; + const int rows1 = matrix1.rows; + const int cols2 = matrix2.cols; + const int rows2 = matrix2.rows; + + const int rowsEqual = (matrix1.rows==matrix2.rows) ? 1: 0; + const int colsEqual = (matrix1.cols==matrix2.cols) ? 1: 0; + // Broadcasting nur bei Vektor und Matrix, Fehlermeldung bei zwei unpassender // Matrix - if (matrix1.rows != matrix2.rows) { - - // check, which one is smaller - // realloc + if (rowsEqual == 1 && colsEqual == 1){ + Matrix result = createMatrix(matrix1.rows, matrix1.cols); + for (int i = 0; i< rows1; i++) { + for (int j= 0; j< cols1; j++){ + int valueM1= getMatrixAt(matrix1, i, j); + int valueM2= getMatrixAt(matrix2, i, j); + int sum = valueM1 + valueM2; + setMatrixAt(sum, result, i, j); + } + } + return result; } + else if (rowsEqual ==1 && colsEqual == 0){ + + } + else if (rowsEqual == 0 && colsEqual == 1){ + + } + else { + - if (matrix1.cols != matrix2.cols) { } // Speicher reservieren From e1ea9f33cd9ac7d4521cefe6fc6825732101d1ee Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 10:55:27 +0100 Subject: [PATCH 16/22] create matrix mit null --- makefile | 14 ++++++-------- matrix.c | 4 ++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/makefile b/makefile index 5d94684..444bd21 100644 --- a/makefile +++ b/makefile @@ -57,12 +57,10 @@ imageInputTests: imageInput.o imageInputTests.c $(unityfolder)/unity.c # -------------------------- # Clean # -------------------------- -#clean: -#ifeq ($(OS),Windows_NT) -# del /f *.o *.exe -#else -# rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests -#endif -# clean für windows clean: - rm -f *.o *.exe \ No newline at end of file +ifeq ($(OS),Windows_NT) + del /f *.o *.exe +else + rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests +endif + \ No newline at end of file diff --git a/matrix.c b/matrix.c index fb44123..da73deb 100644 --- a/matrix.c +++ b/matrix.c @@ -8,6 +8,10 @@ MatrixType *buffer; //Zeiger auf Speicherbereich Reihen*Spalten } Matrix;*/ Matrix createMatrix(unsigned int rows, unsigned int cols) { + if (cols == 0 || rows == 0){ + Matrix errorMatrix = {0, 0, NULL}; + return errorMatrix; + } MatrixType *buffer = malloc(rows * cols * sizeof(MatrixType)); // Speicher reservieren, malloc // liefert Zeiger auf Speicher From 35a598a2769ca0e862a070e9e73fc8c8052f25e6 Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 11:54:32 +0100 Subject: [PATCH 17/22] broadcasting --- matrix.c | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/matrix.c b/matrix.c index da73deb..5f75d77 100644 --- a/matrix.c +++ b/matrix.c @@ -44,6 +44,27 @@ MatrixType getMatrixAt(const Matrix matrix, return value; } +Matrix broadcastingCols(const Matrix matrix, const unsigned int cols){ + Matrix copy1 = createMatrix(matrix.rows, cols); + for (int r= 0; r < matrix.rows; r++){ + MatrixType valueMatrix1 = getMatrixAt(matrix, r, 0); + for (int c=0; c < cols; c++){ + setMatrixAt(valueMatrix1, copy1,r,c); + } + } + return copy1; +} +Matrix broadcastingRows(const Matrix matrix, const unsigned int rows){ + Matrix copy1 = createMatrix(rows, matrix.cols); + for (int c= 0; c < matrix.cols; c++){ + MatrixType valueMatrix1 = getMatrixAt(matrix, c, 0); + for (int r=0; r < rows; r++){ + setMatrixAt(valueMatrix1, copy1,r,c); + } + } + return copy1; + +} Matrix add(const Matrix matrix1, const Matrix matrix2) { // Ergebnismatrix @@ -71,20 +92,33 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) { } return result; } - else if (rowsEqual ==1 && colsEqual == 0){ - + else if (rowsEqual ==1 && (cols1 ==1 || cols2 ==1)){ + if (cols1==1){ //broadcasting von vektor 1 zu matrix 1, add + Matrix newMatrix = broadcastingCols(matrix1, cols2); + //add + } + else{ + Matrix newMatrix2 = broadcastingCols(matrix1, cols1); + //add + } } - else if (rowsEqual == 0 && colsEqual == 1){ + else if ((rows1 ==1 || rows2 ==1) && colsEqual == 1){ + if (rows1==1){ + Matrix newMatrix = broadcastingRows(matrix1, rows2); + //add + } + else{ + Matrix newMatrix2 = broadcastingRows(matrix1, rows1); + //add + } } else { - + // kein add möglich } - // Speicher reservieren - - // Matrix addieren + return result; } From 4e2ee7078a539a086ffe96b6cb540898147f079b Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 12:41:46 +0100 Subject: [PATCH 18/22] alles bis uf multiply --- matrix.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/matrix.c b/matrix.c index 5f75d77..d3987b5 100644 --- a/matrix.c +++ b/matrix.c @@ -28,9 +28,13 @@ void setMatrixAt(const MatrixType value, Matrix matrix, const unsigned int rowIdx, // Kopie der Matrix wird übergeben const unsigned int colIdx) { - matrix.buffer[rowIdx * matrix.cols + colIdx] = - value; // rowIdx * matrix.cols -> Beginn der Zeile colIdx ->Spalte - // innerhalb der Zeile + if (rowIdx >= matrix.rows || colIdx >= matrix.cols) { + // Speichergröße nicht überschreiten + return; + } + matrix.buffer[rowIdx * matrix.cols + colIdx] = value; + // rowIdx * matrix.cols -> Beginn der Zeile colIdx ->Spalte + // innerhalb der Zeile } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, // Kopie der Matrix wird übergeben @@ -57,7 +61,7 @@ Matrix broadcastingCols(const Matrix matrix, const unsigned int cols){ Matrix broadcastingRows(const Matrix matrix, const unsigned int rows){ Matrix copy1 = createMatrix(rows, matrix.cols); for (int c= 0; c < matrix.cols; c++){ - MatrixType valueMatrix1 = getMatrixAt(matrix, c, 0); + MatrixType valueMatrix1 = getMatrixAt(matrix, 0, c); for (int r=0; r < rows; r++){ setMatrixAt(valueMatrix1, copy1,r,c); } @@ -96,10 +100,30 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) { if (cols1==1){ //broadcasting von vektor 1 zu matrix 1, add Matrix newMatrix = broadcastingCols(matrix1, cols2); //add + Matrix result = createMatrix(newMatrix.rows, newMatrix.cols); + for (int i = 0; i< rows1; i++) { + for (int j= 0; j< cols2; j++){ + int valueM1= getMatrixAt(newMatrix, i, j); + int valueM2= getMatrixAt(matrix2, i, j); + int sum = valueM1 + valueM2; + setMatrixAt(sum, result, i, j); + } + } + return result; } else{ - Matrix newMatrix2 = broadcastingCols(matrix1, cols1); + Matrix newMatrix2 = broadcastingCols(matrix2, cols1); //add + Matrix result = createMatrix(newMatrix2.rows, newMatrix2.cols); + for (int i = 0; i< rows1; i++) { + for (int j= 0; j< cols1; j++){ + int valueM1= getMatrixAt(matrix1, i, j); + int valueM2= getMatrixAt(newMatrix2, i, j); + int sum = valueM1 + valueM2; + setMatrixAt(sum, result, i, j); + } + } + return result; } } @@ -107,15 +131,36 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) { if (rows1==1){ Matrix newMatrix = broadcastingRows(matrix1, rows2); //add + Matrix result = createMatrix(newMatrix.rows, newMatrix.cols); + for (int i = 0; i< rows2; i++) { + for (int j= 0; j< cols1; j++){ + int valueM1= getMatrixAt(newMatrix, i, j); + int valueM2= getMatrixAt(matrix2, i, j); + int sum = valueM1 + valueM2; + setMatrixAt(sum, result, i, j); + } + } + return result; } else{ - Matrix newMatrix2 = broadcastingRows(matrix1, rows1); + Matrix newMatrix2 = broadcastingRows(matrix2, rows1); //add + Matrix result = createMatrix(newMatrix2.rows, newMatrix2.cols); + for (int i = 0; i< rows1; i++) { + for (int j= 0; j< cols1; j++){ + int valueM1= getMatrixAt(matrix1, i, j); + int valueM2= getMatrixAt(newMatrix2, i, j); + int sum = valueM1 + valueM2; + setMatrixAt(sum, result, i, j); + } + } + return result; } } else { // kein add möglich - + Matrix errorMatrix = {0, 0, NULL}; + return errorMatrix; } From b187a13b1721d57ab05d88c346bb470de3f9ac57 Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 15:17:12 +0100 Subject: [PATCH 19/22] multiply, besteht MatrixTests --- matrix.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/matrix.c b/matrix.c index d3987b5..e1da69d 100644 --- a/matrix.c +++ b/matrix.c @@ -162,9 +162,27 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) { Matrix errorMatrix = {0, 0, NULL}; return errorMatrix; } - - - return result; } -Matrix multiply(const Matrix matrix1, const Matrix matrix2) { return matrix1; } +Matrix multiply(const Matrix matrix1, const Matrix matrix2) { + //Spalten1 müssen gleich zeilen2 sein! dann multiplizieren + if (matrix1.cols == matrix2.rows){ + Matrix multMatrix = createMatrix(matrix1.rows,matrix2.cols); + for (int r=0; r< matrix1.rows; r++){ + for (int c=0; c< matrix2.cols; c++){ + MatrixType sum = 0.0; + for (int k=0; k< matrix1.cols; k++){ + sum+= matrix1.buffer[r*matrix1.cols+k]*matrix2.buffer[k*matrix2.cols+c]; + } + multMatrix.buffer[r*multMatrix.cols+c] = sum; + } + } + return multMatrix; + } + //sonst fehler + else{ + Matrix errorMatrix = {0, 0, NULL}; + return errorMatrix; + } + //return matrix1; +} From 5075c3498335f25fdc06dc4fa0a4c1f015936c01 Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 15:19:41 +0100 Subject: [PATCH 20/22] kommentaare update --- matrix.c | 1 - 1 file changed, 1 deletion(-) diff --git a/matrix.c b/matrix.c index e1da69d..0d32065 100644 --- a/matrix.c +++ b/matrix.c @@ -184,5 +184,4 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) { Matrix errorMatrix = {0, 0, NULL}; return errorMatrix; } - //return matrix1; } From e7930c7eb0c2f6476d350d3349064bd9f5150a24 Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 15:23:50 +0100 Subject: [PATCH 21/22] kommentaare update --- matrix.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/matrix.c b/matrix.c index 0d32065..bb1dd8e 100644 --- a/matrix.c +++ b/matrix.c @@ -168,18 +168,21 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) { //Spalten1 müssen gleich zeilen2 sein! dann multiplizieren if (matrix1.cols == matrix2.rows){ Matrix multMatrix = createMatrix(matrix1.rows,matrix2.cols); + //durch neue matrix iterieren for (int r=0; r< matrix1.rows; r++){ for (int c=0; c< matrix2.cols; c++){ MatrixType sum = 0.0; + //skalarprodukte berechnen, k damit die ganze zeile mal die ganze spalte genommen wird quasi for (int k=0; k< matrix1.cols; k++){ sum+= matrix1.buffer[r*matrix1.cols+k]*matrix2.buffer[k*matrix2.cols+c]; } + //Ergebnisse in neue matrix speichern multMatrix.buffer[r*multMatrix.cols+c] = sum; } } return multMatrix; } - //sonst fehler + //sonst fehler, kein multiply möglich else{ Matrix errorMatrix = {0, 0, NULL}; return errorMatrix; From 21d9b5c01d41c418b5b8c2959f2a9ea8a64088c4 Mon Sep 17 00:00:00 2001 From: Max-R Date: Sat, 22 Nov 2025 15:29:32 +0100 Subject: [PATCH 22/22] =?UTF-8?q?so=20finde=20ich=20es=20sch=C3=B6ner...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- matrix.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/matrix.c b/matrix.c index bb1dd8e..2a4eb7b 100644 --- a/matrix.c +++ b/matrix.c @@ -174,10 +174,11 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) { MatrixType sum = 0.0; //skalarprodukte berechnen, k damit die ganze zeile mal die ganze spalte genommen wird quasi for (int k=0; k< matrix1.cols; k++){ - sum+= matrix1.buffer[r*matrix1.cols+k]*matrix2.buffer[k*matrix2.cols+c]; + //sum+= matrix1.buffer[r*matrix1.cols+k]*matrix2.buffer[k*matrix2.cols+c]; + sum += getMatrixAt(matrix1, r, k)*getMatrixAt(matrix2, k, c); } //Ergebnisse in neue matrix speichern - multMatrix.buffer[r*multMatrix.cols+c] = sum; + setMatrixAt(sum, multMatrix, r, c); } } return multMatrix;