Array – Producto de Matrices

Enunciado

Escribir un procedimiento que dadas dos matrices A y B y sus dimensiones devuelva la matriz producto C = A + B o una indicación de que no pueden multiplicarse.

Código

Python

def MatrixProd ( fa, fb, ca, cb, a, b ):
    c = []
    for i in range( fa ):
        c.append( [0] * cb )
        
    if ca == fb:
        for i in range ( fa ):
            for j in range ( cb ):
                c[i][j] = 0
                for k in range ( ca ):
                    c[i][j] += a[i][k] * b[k][j]
        return c            
    else:
        return False

def main():
    
    a = [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
    b = [ [ 5, 6, 8 ], [ 8, 9, 1 ], [ 3, 7, 2 ] ]

    c = MatrixProd( 3, 3, 3, 3, a , b )
    
    if not c:
        print( "\nNo se puede multiplicar/" )
        print( "Cannot be multiplied\n" )
    else:
        print( "Columnas/columns", end="" )
        for j in range ( 3 ):
            print( str(j).rjust(10), end="" )
        print( "\n" )
    
        for i in range ( 3 ):
            print( "Fila/rows: ", end="" )
            print( str(i).rjust(5), end="" )
            for j in range ( 3 ):
                print( str(c[i][j]).rjust(10), end="" )
            print( "\n" )
            
    input( "Presionar/Press Enter to exist " )   
main()

C++

#include <iostream>
#include <iomanip>
using namespace std ;
#include <conio.h>


void MatrixProd ( int fa, int fb, int ca, int cb, 
		  float a[][10], float b[][10], 
		  bool* error, float c[][10] )
{
    int i, j, k ;
    
    *error = !( ca == fb ) ;
    if (ca == fb)
       for ( i=0; i<fa; i++ )
    	   for ( j=0 ; j<cb ; j++ )
    	   {
        	c[i][j] = 0 ;
        	for ( k=0; k<ca; k++ )
        	    c[i][j] += a[i][k] * b[k][j] ;
    	   }
}


int main ()
{
    int  i, j, fa, fb, ca, cb ;
    float m1[10][10], m2[10][10], m3[10][10] ;
    bool e ;
   	
    cout << "Ingresar dimension matriz 1/" ;
    cout << "Enter matrix 1 dimension (max 10): " ;
    cin >> fa >> ca ;
    cout << "Ingresar elementos/" ;
    cout << "Enter elements: " << endl ;
    for( i=0; i<fa; i++ )
    {
       for ( j=0; j<ca; j++ )
           cin >> m1[i][j] ;
       cout << endl ;
    }
      
    cout << endl << endl ;
    cout << "Ingresar dimension matriz 2/" ;
    cout << "Enter matrix 2 dimension (max 10): " ;
    cin >> fb >> cb ;
    cout << "Ingresar elementos / Enter elements: " ;
    cout << endl ;
    for( i=0; i<fb; i++ )
    {
       for ( j=0; j<cb; j++ )
           cin >> m2[i][j] ;
       cout << endl ;
    }
    
    cout << endl << endl ;
    MatrixProd( fa, fb, ca, cb, m1, m2, &e, m3 ) ;
    if (e)
    { 
       cout << endl << "No se puede multiplicar/" ;
       cout << "Cannot be multiplied" << endl ;
    }
    else
       for (i=0; i<fa; i++)
       {
           cout << endl ;
           for (j=0; j<cb; j++)
               cout << setw(5) << m3[i][j] ;
       }
	
    cout << endl ;
    cout << "Presionar/Press Enter to exit " ;	    
    getch() ;
    return 0 ;
}

Pascal

Program Array04 ;
uses CRT ;
const nmax = 10 ;
type
    dim = 1 .. nmax ;
    matrix = array [ dim , dim ] of real ;

var
    i, j, ca, cb, fa, fb : dim ;
    a, b, c : matrix ;
    error : boolean ;

procedure MatrixProd ( fa, fb, ca, cb: dim ; 
		       var a, b: matrix ; 
		       var error: boolean ; 
		       var c: matrix ) ;
var i, j, k: integer ;

begin
    error := not( ca = fb ) ;
    if ( ca=fb )
    then
    for i := 1 to fa do
    	for j := 1 to cb do
	begin
            c[i][j] := 0 ;
            for k := 1 to ca do
               c[i][j] := c[i][j] + a[i][k] * b[k][j] ;
    	end ;
end ;

begin
    ClrScr ;
    write( 'Ingresar la dimension 1 : ' ) ; 
    readln( fa, ca ) ;
    writeln( 'Ingresar la matriz 1: ' ) ;
    for i := 1 to fa do
	for j := 1 to ca do
	    readln( a[i, j] ) ;
        
    write( 'Ingresar la dimension 2 : ' ) ; 
    readln( fb, cb ) ;
    writeln( 'Ingresar la matriz 2: ' ) ;
    for i := 1 to fb do
	for j := 1 to cb do
	    readln( b[i, j] ) ;
				
    MatrixProd( fa, fb, ca, cb, a, b, error, c ) ;
        
    if error
    then
    begin
	write( 'No se puede multiplicar/' ) ;
	writeln( 'Cannot be multiplied' )
    end
    else
	for i := 1 to fa do
	begin
	    for j := 1 to cb do
		write( c[i, j]:15:2 ) ;
	    writeln
	end ;
    writeln ;
    writeln( 'Presionar/Press Enter to exit' ) ;
    readln ;
end.

Diagramas