Matrizes em C

Shelter

Power Member
Boas tou a tentar criar uma matriz 4x4 em C a partir de 2 matrizes 2x2, i.e.,

A =
1 2
3 4

B =
5 6
7 8

e queria que ficasse
C=
1*5; 1*6; 1*7; 1*8
2*5; 2*6; 2*7; 2*8
3*5; 3*6; 3*7; 3*8
4*5; 4*6; 4*7; 4*8

Alguém consegue ajudar, é que estou com um grande nó!

Obrigado

P.s. Desculpem mas nao estou a conseguir desenhar melhor as matrizes mas penso que se percebe
 
Boas!

Isso não é propriamente o resultado de uma multiplicação convencional de matrizes, no entanto pegando no teu exemplo julgo que nem é complicado de fazer isso.

Precisas de saber qual vai ser o tamanho da matriz resultante, esse tamanho consegues obter facilmente com a múltiplicação de n*m e i*j sendo as matrizes ni e mj.

Para a preencheres é só usando ciclos, tens as linhas e as colunas :P

Dois ciclos bastam, de 0 a n*m-1 para as linhas, e de 0 a i*j-1 para as colunas.

Com base nisto tenta elaborar mais o teu trabalho e depois apresenta dúvidas mais concretas. Se interpretei mal o teu problema em algum lado, avisa, sff.

abraços, HecKel
 
Boas!

Isso não é propriamente o resultado de uma multiplicação convencional de matrizes, no entanto pegando no teu exemplo julgo que nem é complicado de fazer isso.

Precisas de saber qual vai ser o tamanho da matriz resultante, esse tamanho consegues obter facilmente com a múltiplicação de n*m e i*j sendo as matrizes ni e mj.

Para a preencheres é só usando ciclos, tens as linhas e as colunas :P

Dois ciclos bastam, de 0 a n*m-1 para as linhas, e de 0 a i*j-1 para as colunas.

Com base nisto tenta elaborar mais o teu trabalho e depois apresenta dúvidas mais concretas. Se interpretei mal o teu problema em algum lado, avisa, sff.

abraços, HecKel
Obrigado Pela Resposta ao Post ;)

Sim eu já tinha começado a elaborar o código e depois ate recebi uma ajuda de outro user,
que acabou por ficar assim

int main()
{
FILE *fp;
fp = fopen("mat.txt","w");
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{5,6},{7,8}};
int c[4][4];
int i,j;

for(i=0;i<4;i++){
for(j=0;j<4;j++){
c[i][j]=a[0][i]*b[0][j];
fprintf(fp,"%d|%d|%f\t",i,j,c[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
return 0;
}

E resultou, só estou com alguma dificuldade em perceber a linha:
c[i][j]=a[0][i]*b[0][j]; pq tem os indices a 0??


Obrigado:007:
 
Obrigado Pela Resposta ao Post ;)

Sim eu já tinha começado a elaborar o código e depois ate recebi uma ajuda de outro user,
que acabou por ficar assim

int main()
{
FILE *fp;
fp = fopen("mat.txt","w");
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{5,6},{7,8}};
int c[4][4];
int i,j;

for(i=0;i<4;i++){
for(j=0;j<4;j++){
c[i][j]=a[0][i]*b[0][j];
fprintf(fp,"%d|%d|%f\t",i,j,c[j]);
}
fprintf(fp,"\n");
}
fclose(fp);
return 0;
}

E resultou, só estou com alguma dificuldade em perceber a linha:
c[i][j]=a[0][i]*b[0][j]; pq tem os indices a 0??


Obrigado:007:


o indice 0 equivale ao 1 em linguagem "matematica". Por exemplo uma matriz com 3 linhas: A primeira linha é indice 0, a segunda indice 1, a terceira indice 2.
 
o indice 0 equivale ao 1 em linguagem "matematica". Por exemplo uma matriz com 3 linhas: A primeira linha é indice 0, a segunda indice 1, a terceira indice 2.

sim isso eu percebo, o que não percebi é que como o funciona tendo a matriz a[0] com a linha "bloqueada" ao indice "0" e também a matriz b[0][j] com o linha bloqueada também.

Quando incrementamos o valor de "j" e chega a 3, o "i" passa a 1, mas as matrizes continuaram bloqueadas com as linhas em "0".

Era essa a minha dificuldade em perceber :wvsore:
 
Tive a ver essa resolução por alto e está mal, por isso vou-te a fazer em java que é o que eu domino ;) tentando reaproveitar o codigo do teu compincha ;)

int main()
{
FILE *fp;
fp = fopen("mat.txt","w");
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{5,6},{7,8}};
int c[4][4];
int i,j;
int tamanhoA, tamanhoB;
tamanhoA = a.lenght() * a[0].lenght(); //multiplica o nr de linhas pelo numero de colunas
tamanhoB = b.lenght() * b[0].lenght();
for (i=0;i <tamanhoA; i++)
{
int z = a [ (int) i / a.lenght()][ ( i %a.lenght()]; //% resto da divisão inteira, (int) divisão inteira utilizando casting
for (j=0; j < tamanhoB ; j++)
{
int y = b [(int) j / b.lenght()][ (int) i % b.lenght()];
c[j] = z * y;
}
}

//só tens k usar uns printf para mostrar os resultados

para o teu prob a minha solução é melhor, agora convertes para C, que deve ser parecido ao que eu fiz :004:
 
sim isso eu percebo, o que não percebi é que como o funciona tendo a matriz a[0] com a linha "bloqueada" ao indice "0" e também a matriz b[0][j] com o linha bloqueada também.

Quando incrementamos o valor de "j" e chega a 3, o "i" passa a 1, mas as matrizes continuaram bloqueadas com as linhas em "0".

Era essa a minha dificuldade em perceber :wvsore:


Já respondi, estava a escrever a solução enquanto tu postavas, vou dormir :)
 
Tive a ver essa resolução por alto e está mal, por isso vou-te a fazer em java que é o que eu domino ;) tentando reaproveitar o codigo do teu compincha ;)

int main()
{
FILE *fp;
fp = fopen("mat.txt","w");
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{5,6},{7,8}};
int c[4][4];
int i,j;
int tamanhoA, tamanhoB;
tamanhoA = a.lenght() * a[0].lenght(); //multiplica o nr de linhas pelo numero de colunas
tamanhoB = b.lenght() * b[0].lenght();
for (i=0;i <tamanhoA; i++)
{
int z = a [ (int) i / a.lenght()][ ( i %a.lenght()]; //% resto da divisão inteira, (int) divisão inteira utilizando casting
for (j=0; j < tamanhoB ; j++)
{
int y = b [(int) j / b.lenght()][ (int) i % b.lenght()];
c[j] = z * y;
}
}

//só tens k usar uns printf para mostrar os resultados

para o teu prob a minha solução é melhor, agora convertes para C, que deve ser parecido ao que eu fiz :004:

int main()
{
FILE *fp;
fp = fopen("mat.txt","w");
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{5,6},{7,8}};
int c[4][4];
int z[2][2];
int y[2][2];
int i,j;

for(i=0;i<4;i++){ //4 já é a multiplicaçao do nº linhas pelo numero colunas de A
int z = a [(int) i / 2][(i%2)];}
for(j=0;j<4;j++){
int y = b [(int) j / 2][(int)i%2];}

for(i=0;i<4;i++){
for(j=0;j<4;j++){
c[j] = z[j] * y[j];}}

}

Desculpa mas assim não entendo ou não da o que pretendo
 
int main()
{
FILE *fp;
fp = fopen("mat.txt","w");
int a[2][2]={{1,2},{3,4}};
int b[2][2]={{5,6},{7,8}};
int c[4][4];
int z[2][2];
int y[2][2];
int i,j;

for(i=0;i<4;i++){ //4 já é a multiplicaçao do nº linhas pelo numero colunas de A
int z = a [(int) i / 2][(i%2)];}
for(j=0;j<4;j++){
int y = b [(int) j / 2][(int)i%2];}

for(i=0;i<4;i++){
for(j=0;j<4;j++){
c[j] = z[j] * y[j];}}

}

Desculpa mas assim não entendo ou não da o que pretendo


É isso que tu fizes-te, eu me pus a medir o tamanho das matrizes para o programa se poder adaptar a matrizes de qualquer tamanho.

Opa a cena das divisões inteiras e restos a malta normalmente tem probs em entender... andas a programar ha pouco tempo?
 
Tive a ver essa resolução por alto e está mal, por isso vou-te a fazer em java que é o que eu domino ;) tentando reaproveitar o codigo do teu compincha ;)

em Java estaria mal, mas em C não está. isto devido à forma como o C armazena os arrays em memória, que faz com que, para uma matriz de n colunas, aceder à posição M[j] seja igual a aceder à posição M[0][i*n+j].
 
em Java estaria mal, mas em C não está. isto devido à forma como o C armazena os arrays em memória, que faz com que, para uma matriz de n colunas, aceder à posição M[j] seja igual a aceder à posição M[0][i*n+j].


hmm, já fiquei a saber uma coisa para quando for programar C, assim já não tenho de andar a fazer habilidades como eu andava a fazer :kfold:, no entanto a minha habilidade funciona em C e em java :)
 
people eu também tinha me explicar mal, o que eu queria realmente e queria fazer era o seguinte:

Codigo:

for (i=0;i<size;i++){
for (j=0;j<size;j++){
for (x=0; x<size; x++){
for (y=0; y<size; y++){
p0[x+(size*i)][y+(size*j)] =pf1[j]*pf2[x][y];
r0[x+(size*i)][y+(size*j)] =rf1[j]+rf2[x][y];
}
}
}
}

[]:kfold:
 
Tens ideia da complexidade do teu código? 4 ciclos for sobrepostos?

Sinceramente ainda não percebi bem o que queres fazer, mas essa tua implementação é de uma complexidade absurda mesmo. Haja tempo! size^4 vezes os mesmos comandos é obra.

Tenta lá explicar bem o que queres fazer.

Já agora, quando colocares código num post, mete entre as tags de [code] CÓDIGO [/code], fica bastante mais legível a quem te vai ajudar/ler a thread.

abraços, HecKel
 
hmm, já fiquei a saber uma coisa para quando for programar C, assim já não tenho de andar a fazer habilidades como eu andava a fazer :kfold:, no entanto a minha habilidade funciona em C e em java :)

ha que ter cuidado isso resulta em arrays bidimensionais de inteiros mas em arrays bidimensionais de strings nao por causa do ultimo caracter de cada string ser o caracter null ('\0')

abrc
 
Última edição:
Tenho 2 matriz A e B que são 2x2 e quero a matriz C que são 4x4

Código:
A= 1   2              B= 5    6
   3   4                 7    8

e quero o resultado:

C= 
1*5        1*6        2*5        2*6      5    6    10    12
1*7        1*8        2*7        2*8   =  7    8    14    16 
3*5        3*6        4*5        4*6      15  18    20    24 
3*7        3*8        4*7        4*8      21  24    28    32
Acho que consegui explicar ;)

[]
 
Back
Topo