add function
This commit is contained in:
parent
e72c8c454e
commit
f94ec127f9
31
matrix.c
31
matrix.c
@ -50,7 +50,36 @@ return matrix.buffer [index]; // return the value at that index
|
|||||||
}
|
}
|
||||||
|
|
||||||
Matrix add(const Matrix matrix1, const Matrix matrix2)
|
Matrix add(const Matrix matrix1, const Matrix matrix2)
|
||||||
{
|
{ if (matrix1.rows != matrix2.rows){ // check row compatibility
|
||||||
|
Matrix empty = {.rows =0, .cols=0, .buffer = NULL};
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
if (matrix1.cols!= matrix2.cols && matrix2.cols !=1 && matrix1.cols != 1){ // check column compatibility (allow broadcasting )
|
||||||
|
Matrix empty = {.rows =0, .cols=0, .buffer =NULL};
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
unsigned int resultRows = matrix1.rows; //determine result dimensions
|
||||||
|
unsigned int resultCols = (matrix1.cols > matrix2.cols) ? matrix1.cols: matrix2.cols;
|
||||||
|
//Allocate memory for the result buffer
|
||||||
|
MatrixType *resultBuffer = malloc(resultRows * resultCols * sizeof(MatrixType));
|
||||||
|
if (resultBuffer == NULL){
|
||||||
|
Matrix empty = {.rows =0, .cols=0, .buffer=NULL};
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
// add elements element-wise with broadcasting
|
||||||
|
for (unsigned int row =0; row < resultRows; ++row){
|
||||||
|
for (unsigned int col =0; col < resultCols; ++col){
|
||||||
|
MatrixType val1 = getMatrixAt(matrix1, row, col);
|
||||||
|
//Handle broadcasting: if matrix2 has 1 column, use column 0
|
||||||
|
unsigned int col2 = (matrix2.cols==1) ? 0 : col;
|
||||||
|
MatrixType val2 = getMatrixAt(matrix2, row, col2);
|
||||||
|
|
||||||
|
unsigned int resultIndex = row * resultCols + col;
|
||||||
|
resultBuffer[resultIndex] = val1 +val2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Matrix result = {.rows = resultRows, .cols = resultCols, .buffer= resultBuffer};
|
||||||
|
return result; //create and return result
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user