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)
|
||||
{
|
||||
{ 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