1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Matrizes em C

Discussão em 'Programação' iniciada por Shelter, 11 de Abril de 2007. (Respostas: 14; Visualizações: 3274)

  1. Shelter

    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
     
  2. HecKel

    HecKel The WORM

    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
     
  3. Shelter

    Shelter Power Member

    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:
     
  4. theforbidden1

    theforbidden1 Banido



    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.
     
  5. Shelter

    Shelter Power Member

    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:
     
  6. theforbidden1

    theforbidden1 Banido

    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:
     
  7. theforbidden1

    theforbidden1 Banido



    Já respondi, estava a escrever a solução enquanto tu postavas, vou dormir :)
     
  8. Shelter

    Shelter Power Member


    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
     
  9. theforbidden1

    theforbidden1 Banido



    É 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?
     
  10. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    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].
     
  11. theforbidden1

    theforbidden1 Banido



    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 :)
     
  12. Shelter

    Shelter Power Member

    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:
     
  13. HecKel

    HecKel The WORM

    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
     
  14. machu

    machu Power Member

    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: 14 de Abril de 2007
  15. Shelter

    Shelter Power Member

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

    []
     

Partilhar esta Página