multiplicaçao de matrizes em C++

16 respostas
A

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

16 Respostas

andeb

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.

davidbuzatto

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

Andre_Rosa

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

Poste o que você já fez.

andeb

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

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

A

//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!

Andre_Rosa

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!

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

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!

Andre_Rosa

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!

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

[b]resultado da matriz Resultante 6 6 6

6    6    6

4    4    4

[/b]

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 ?

A

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??

ViniGodoy

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:
[img]http://upload.wikimedia.org/math/a/3/9/a39785aa9f8b4ab1c26e97efdaa35a3d.png[/img]

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

Em C++ e corrigido, seu programa ficaria assim:
//Fazer um programa que leia uma matriz M1 3x2e uma matriz M2 2x3
// e calcule a multiplicação de M1 por M2.

#include &lt;iostream&gt;

using namespace std;

int main ()
{
	//primeira matriz 3x2
	int mt1 [3][2];
	cout &lt;&lt; &quot;Digite a matriz 1:&quot; &lt;&lt; endl;
	for(int linha=0; linha &lt; 3; linha++)
		for(int coluna=0; coluna &lt; 2; coluna++)
			cin &gt;&gt; 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;
}
ViniGodoy
Se usar um pouco mais de C++, dá pra simplificar o código e evitar muita duplicação:
//Fazer um programa que leia uma matriz M1 3x2e uma matriz M2 2x3
// e calcule a multiplicação de M1 por M2.

#include &lt;iostream&gt;
using namespace std;

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

template&lt;typename T&gt;
void imprimirMatriz(T matriz, int linhas, int colunas)
{
	for (int linha = 0; linha &lt; linhas; linha++)
	{
		for (int coluna = 0; coluna &lt; colunas; coluna++)
			cout &lt;&lt; matriz[linha][coluna] &lt;&lt; &quot; &quot;;
		cout &lt;&lt; endl;
	}
	cout &lt;&lt; endl;
}

int main ()
{	
	//primeira matriz 3x2
	int mt1[3][2];
	cout &lt;&lt; &quot;Digite a matriz 1:&quot; &lt;&lt; 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;
}
E

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.

ViniGodoy

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?

A

"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!

ViniGodoy

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!

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.

E

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.

Criado 31 de outubro de 2010
Ultima resposta 1 de nov. de 2010
Respostas 16
Participantes 6