multiplicaçao de matrizes em C++

Oi!
gostaria de saber como faço a multiplicaçao das matrizes desse problema, e como faço pra imprimi-la usando o c++!

“Fazer um programa que leia uma matriz M13x2e uma matriz M22x3,e calcule a multiplicação de M1 por M2.”

obrigada!

xD

Não dá de multiplicar essa matriz. O número de colunas da M1 precisa ser o mesmo que o número de linhas da M2.

Hein? Mas não é assim? M1 tem 2 linhas, três colunas. M2 tem 3 linhas, 2 colunas.

Olha a definição de multiplicação entre matrizes:

Analisando a definição é possível facilmente escrever o algoritimo.

[]´s

[quote=alinecs]Oi!
gostaria de saber como faço a multiplicaçao das matrizes desse problema, e como faço pra imprimi-la usando o c++!

“Fazer um programa que leia uma matriz M13x2e uma matriz M22x3,e calcule a multiplicação de M1 por M2.”

obrigada!

xD[/quote]

Poste o que você já fez.

Hein? Mas não é assim? M1 tem 2 linhas, três colunas. M2 tem 3 linhas, 2 colunas.

Olha a definição de multiplicação entre matrizes:

Analisando a definição é possível facilmente escrever o algoritimo.

[]´s[/quote]

Ah, perfeito, fui cabaço mesmo, li 13 linhas para uma e 22 linhas para outra. xD

//Fazer um programa que leia uma matriz M13x2e uma matriz M22x3
// e calcule a multiplicação de M1 por M2.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
int mt1 [3][2], mt2 [2][3];
int linha, coluna;
int mtRES[3][3];

//primeira matriz 3x2

printf ("Digite a matriz 1:\n");
for(linha=0; linha<3; linha++)
{ 
             for(coluna=0; coluna<2; coluna++)
             scanf("%10d", &mt1[linha][coluna]);
}
for (linha=0; linha<3; linha++)
{
              for(coluna=0; coluna<2; coluna++)
              printf ("%5d", mt1[linha] [coluna]);
    printf("\n\n");
}

//segunda matriz 2x3

printf (“Digite a matriz 2:\n”);
for(linha=0; linha<2; linha++)
{
for(coluna=0; coluna<3; coluna++)
scanf("%10d", &mt2[linha][coluna]);
}
for (linha=0; linha<2; linha++)
{
for(coluna=0; coluna<3; coluna++)
printf ("%5d", mt2[linha] [coluna]);
printf("\n\n");
}

//multiplicaçao da primeira com a segunda matriz= matriz quadrada [3][3]

 printf("resultado da matriz Resultante");/*agora a multiplicação das duas*/
 for (linha=0;linha<3;linha++)
 {
            for(coluna=0;coluna<3;coluna++)
            mtRES[linha][coluna]=(mt1[linha][coluna]*mt2[linha][coluna]);/*armazenando em uma terceira*/
 }
for(linha=0;linha<3;linha++)
{
            for(coluna=0;coluna<3;coluna++)
            printf("%5d",mtRES[linha][coluna]);
            printf ("\n\n");
}
system ("pause");
return 0;

}

está lendo as duas matrizes bem certinho e tal!
mas na parte da multiplicaçao tentei uma coisa mas nao deu mto certo!

[quote=alinecs]//Fazer um programa que leia uma matriz M13x2e uma matriz M22x3
// e calcule a multiplicação de M1 por M2.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
int mt1 [3][2], mt2 [2][3];
int linha, coluna;
int mtRES[3][3];

//primeira matriz 3x2

printf ("Digite a matriz 1:\n");
for(linha=0; linha<3; linha++)
{ 
             for(coluna=0; coluna<2; coluna++)
             scanf("%10d", &mt1[linha][coluna]);
}
for (linha=0; linha<3; linha++)
{
              for(coluna=0; coluna<2; coluna++)
              printf ("%5d", mt1[linha] [coluna]);
    printf("\n\n");
}

//segunda matriz 2x3

printf (“Digite a matriz 2:\n”);
for(linha=0; linha<2; linha++)
{
for(coluna=0; coluna<3; coluna++)
scanf("%10d", &mt2[linha][coluna]);
}
for (linha=0; linha<2; linha++)
{
for(coluna=0; coluna<3; coluna++)
printf ("%5d", mt2[linha] [coluna]);
printf("\n\n");
}

//multiplicaçao da primeira com a segunda matriz= matriz quadrada [3][3]

 printf("resultado da matriz Resultante");/*agora a multiplicação das duas*/
 for (linha=0;linha<3;linha++)
 {
            for(coluna=0;coluna<3;coluna++)
            mtRES[linha][coluna]=(mt1[linha][coluna]*mt2[linha][coluna]);/*armazenando em uma terceira*/
 }
for(linha=0;linha<3;linha++)
{
            for(coluna=0;coluna<3;coluna++)
            printf("%5d",mtRES[linha][coluna]);
            printf ("\n\n");
}
system ("pause");
return 0;

}

está lendo as duas matrizes bem certinho e tal!
mas na parte da multiplicaçao tentei uma coisa mas nao deu mto certo!
[/quote]

Defina “coisa” e “não deu muito certo”. O código esta compilando corretamente ? Se não, qual é o erro informado pelo compilador ? Qual é a saída que você espera que o programa dê ? Dê informações detalhadas como por exemplo:

Eu entro com X e o programa me retorna Y, sendo que deveria retornar J.

a matriz A e B, quando digitadas aparecem corretamente!

o programa esta compilando, porém o resultado, ao inves de ser uma matriz 3x3 está aparecendo essa matriz 3x3 e
mais uns numeros estranhos q nao tem nada a ver

por exemplo, digito as matrizes:
A- 2 2
2 2
2 2

B- 3 3 3
3 3 3

o resultado é uma matriz assim
6 6 6
6 6 6

4587120-31-690246 70

esses ultimos numeros q nao sei o q significam, e nem onde está meu erro!

[quote=alinecs]a matriz A e B, quando digitadas aparecem corretamente!

o programa esta compilando, porém o resultado, ao inves de ser uma matriz 3x3 está aparecendo essa matriz 3x3 e
mais uns numeros estranhos q nao tem nada a ver

por exemplo, digito as matrizes:
A- 2 2
2 2
2 2

B- 3 3 3
3 3 3

o resultado é uma matriz assim
6 6 6
6 6 6

4587120-31-690246 70

esses ultimos numeros q nao sei o q significam, e nem onde está meu erro!

[/quote]

Compilei o seu código aqui,e foi normalmente, olhe só:

[quote][b]resultado da matriz Resultante 6 6 6

6    6    6

4    4    4

[/b][/quote]

Estou usando o Debian Linux, compilei o código com o gcc versão 4.3.2. Qual plataforma, compilador e IDE (caso esteja tenha) você esta usando ?

eu uso o DEV C++ 4.9.9.2

deu certo msm???
que legal!

qual problema pode estar acontecendo entao q o resultado nao aparecer direito no meu pc??

Oi.

Primeiro de tudo, o seu programa está em C, não em C++.

Segundo, ao postar códigos, por favor, use a tag code, como descrito aqui:
http://www.guj.com.br/posts/list/50115.java

Terceiro, o devcpp não é uma IDE adequada para o desenvolvimento hoje em dia. Além de ser cheia de bugs, seu compilador é bastante antigo. Recomendo que você substitua pelo Code::Blocks: http://www.codeblocks.org ou o Visual C++ Express: http://www.microsoft.com/express/

Como compilador o Code::Blocks também usa o MinGW32, mas tem o suporte correto a depuração e mostra as mensagens de erro por inteiro.
Já o Visual usa um compilador próprio, e é hoje a IDE C++ mais usada no mercado.

Quarto, sua fórmula de multiplicação de matrizes está completamente errada. A multiplicação correta segue o algoritmo:

E, finalmente, você esqueceu de zerar a matriz mtRES.

Em C++ e corrigido, seu programa ficaria assim:

[code]
//Fazer um programa que leia uma matriz M1 3x2e uma matriz M2 2x3
// e calcule a multiplicação de M1 por M2.

#include <iostream>

using namespace std;

int main ()
{
//primeira matriz 3x2
int mt1 [3][2];
cout << "Digite a matriz 1:" << endl;
for(int linha=0; linha < 3; linha++)
for(int coluna=0; coluna < 2; coluna++)
cin >> mt1[linha][coluna];

for (int linha=0; linha &lt; 3; linha++)
{
	for(int coluna=0; coluna &lt; 2; coluna++)
		cout &lt;&lt; mt1[linha][coluna] &lt;&lt; &quot; &quot;;			
	cout &lt;&lt; endl;
}
cout &lt;&lt; endl;

int mt2 [2][3];

//segunda matriz 2x3
cout &lt;&lt; &quot;Digite a matriz 2:&quot; &lt;&lt; endl;
for(int linha=0; linha &lt; 2; linha++)
	for(int coluna=0; coluna &lt; 3; coluna++)
		cin &gt;&gt; mt2[linha][coluna];

for (int linha=0; linha &lt; 2; linha++)
{
	for(int coluna=0; coluna &lt; 3; coluna++)
		cout &lt;&lt; mt2[linha][coluna] &lt;&lt; &quot; &quot;;			
	cout &lt;&lt; endl;
}
cout &lt;&lt; endl;

//multiplicaçao da primeira com a segunda matriz= matriz quadrada [3][3]

cout &lt;&lt; &quot;resultado da matriz Resultante&quot; &lt;&lt; endl;

int mtRES[3][3];

/*Zera a matriz resultado */
for (int i = 0; i &lt; 3; i++)
	for (int j = 0; j &lt; 3; j++)
		mtRES[i][j] = 0;

/*agora a multiplicação das duas*/
for(int i = 0; i &lt; 3; i++)
	for(int j = 0; j &lt; 3; j++) 
		for(int k = 0; k &lt; 2; k++)
			mtRES[i][j] += mt1[i][k]*mt2[k][j];

for(int linha=0; linha &lt; 3; linha++)
{
	for(int coluna=0;coluna&lt;3;coluna++)
		cout &lt;&lt; mtRES[linha][coluna] &lt;&lt; &quot; &quot;;
	cout &lt;&lt; endl;
}		
return 0;

} [/code]

Se usar um pouco mais de C++, dá pra simplificar o código e evitar muita duplicação:

[code]//Fazer um programa que leia uma matriz M1 3x2e uma matriz M2 2x3
// e calcule a multiplicação de M1 por M2.

#include <iostream>
using namespace std;

template<typename T>
void lerMatriz(T matriz, int linhas, int colunas)
{
for(int linha=0; linha < linhas; linha++)
for(int coluna=0; coluna < colunas; coluna++)
{
cout << "Entre com o elemento m[" << linha << "][" << coluna << "]: ";
cin >> matriz[linha][coluna];
}
cout << endl;
}

template<typename T>
void imprimirMatriz(T matriz, int linhas, int colunas)
{
for (int linha = 0; linha < linhas; linha++)
{
for (int coluna = 0; coluna < colunas; coluna++)
cout << matriz[linha][coluna] << " ";
cout << endl;
}
cout << endl;
}

int main ()
{
//primeira matriz 3x2
int mt1[3][2];
cout << "Digite a matriz 1:" << endl;
lerMatriz(mt1, 3, 2);
imprimirMatriz(mt1, 3, 2);

//segunda matriz 2x3
int mt2[2][3];
cout &lt;&lt; &quot;Digite a matriz 2:&quot; &lt;&lt; endl;
lerMatriz(mt2, 2, 3);
imprimirMatriz(mt2, 2, 3);

//multiplicaçao da primeira com a segunda matriz= matriz quadrada [3][3]
cout &lt;&lt; &quot;resultado da matriz Resultante&quot; &lt;&lt; endl;

int mtRES[3][3];
/*Zera a matriz resultado */
for (int i = 0; i &lt; 3; i++)
	for (int j = 0; j &lt; 3; j++)
		mtRES[i][j] = 0;

/*agora a multiplicação das duas*/
for(int i = 0; i &lt; 3; i++)
	for(int j = 0; j &lt; 3; j++) 
		for(int k = 0; k &lt; 2; k++)
			mtRES[i][j] += mt1[i][k]*mt2[k][j];

imprimirMatriz(mtRES, 3, 3);
return 0;

} [/code]

Pois é. Cada vez que tenho de trocar de linguagem (de Java para C++ ou vice-versa) eu me ferro com essa diferença entre as linguagens. Em Java as matrizes já vêm limpinhas (e a partir de alguma build do JDK o Arrays.fill terá exatamente o mesmo desempenho de um memset). Em C++, as variáveis de instância você tem de limpar antes, o que é sempre um porre.

Me confirme uma coisa.
No C++ não tem mesmo um jeito standard de passar matrizes bidimensionais de tamanho arbitrário por parâmetro, tem?

Isso aqui:

Até funciona com um reinterpret_cast (ouch), mas tem o funcionamento realmente garantido?

No segundo código, acabei recorrendo à templates (que na prática criará um método diferente para cada matriz).

A única alternativa portável seria recorrer mesmo ao boost::matrix?

"Terceiro, o devcpp não é uma IDE adequada para o desenvolvimento hoje em dia. Além de ser cheia de bugs, seu compilador é bastante antigo. Recomendo que você substitua pelo Code::Blocks: http://www.codeblocks.org ou o Visual C++ Express: http://www.microsoft.com/express/

Como compilador o Code::Blocks também usa o MinGW32, mas tem o suporte correto a depuração e mostra as mensagens de erro por inteiro.
Já o Visual usa um compilador próprio, e é hoje a IDE C++ mais usada no mercado."

eu uso o dev c, porque apenas faço uma cadeira da faculdade de introduçao a programaçao, nem é para trabalho,
e o professor exige q seja com esse programaa!

obrigada!

[quote=alinecs]eu uso o dev c, porque apenas faço uma cadeira da faculdade de introduçao a programaçao, nem é para trabalho,
e o professor exige q seja com esse programaa![/quote]

Converse com seu professor, e comente sobre o Code::Blocks.
Como o compilador é equivalente ao dev, ele não terá que fazer nenhum tipo de adaptação nos programas.

O problema do dev é que ele tem o péssimo hábito de engolir uma ou outra mensagem de erro de vez enquando. E aí, temos alunos frustrados, procurando por horas por um bug que não está corretamente descrito.

Infelizmente, não. Não tenho aqui um compilador C99 para indicar a sintaxe C99 (que não foi incorporada pelos compiladores C++) para esse tipo de coisas. Isso é porque o C e o C++, como o Java, na verdade não têm um bom conceito de matrizes bidimensionais. Mal e mal o C e o C++ conseguem usar matrizes bidimensionais de tamanhos fixos (e usar uma multiplicação simples para achar os índices dentro de um bloco de memória). O Java, nesse ponto, é pior ainda, porque nem consegue fazer esse tipo de acesso. Se ele tivesse uma sintaxe como a do C# (onde cada índice é separado por vírgulas, em vez de usar essa gambiarra dos infernos de [][][]) o Java poderia ser até uma alternativa razoável para cálculo numérico.