• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

shelter

Matrizes em C

13 mensagens neste tópico

:rant_01:

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

A = [table]

[/table]

B = [table]

[/table]

e queria que ficasse C=[table]

[/table]

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

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

for(i=0;i<4;i++)
  for(j=0;j<4;j++)
    M[i][j]=A[0][i]*B[0][j]

deve resolver o problema, embora seja uma forma um pouco "suja" de o fazer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas do [ 0 ] no A e no B

raio do SMF mais as correcções...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

for(i=0;i<4;i++)
  for(j=0;j<4;j++)
    M[i][j]=A[0][i]*B[0][j]

deve resolver o problema, embora seja uma forma um pouco "suja" de o fazer...

Não deve funcionar, por 2 razões a primeira vista:

1º - que o indice da linha tiver um 0 nunca irá pegar nos valores do indice da segunda linha de A

2º - se os indices vao de 0 a 3, e a matriz A e B só vão de 0 a 1, o ciclo irá dar indices 2 e 3 com os valores errados que pretendo.

O meu problema esta mesmo ai, não saber como definir os ciclos, pois as matrizes sao 2x2 e a final ira ser 4x4

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não deve funcionar, por 2 razões a primeira vista:

1º - que o indice da linha tiver um 0 nunca irá pegar nos valores do indice da segunda linha de A

2º - se os indices vao de 0 a 3, e a matriz A e B só vão de 0 a 1, o ciclo irá dar indices 2 e 3 com os valores errados que pretendo.

O meu problema esta mesmo ai, não saber como definir os ciclos, pois as matrizes sao 2x2 e a final ira ser 4x4

por acaso estás enganado...

A[k][j] <=> A[0][k*2+j]    (o 2 é o número de colunas)

ou seja,

A[1][0] <=> A[0][2+0]

A[1][1] <=> A[0][2+1]

está a recorrer a pormenores da implementação do C, e caso seja para um trabalho escolar é capaz de não ser muito boa ideia fazer assim...

offtopic

por que raio é que o SMF substitui o 'kk' (tive que por dois senão voltava a substituir) por 'que'?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas do [ 0 ] no A e no B

acho que estás enganado... acho que A[ i ] vai ser o endereço da linha i, provavelmete presivas de uns casts para poderes tirar o [ 0 ].

PS: edita o teu post anterior, mete um espaço antes do zero, por exemplo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

por acaso estás enganado...

A[que][j] <=> A[0][que*2+j]    (o 2 é o número de colunas)

ou seja,

A[1][0] <=> A[0][2+0]

A[1][1] <=> A[0][2+1]

Desculpa mas não estou a perceber o que queres dizer, até ja testei e não vejo a funcionar,

Se dizes que A[1][0]<=> A[0][2+0] é a mesmo coisa que A[1][0]<=>A[0][2] => 3<=> e qual é o valor de A[0][2]?? É que a matriz A só tem indice 0 e 1, pois é de 2x2

[]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

aparentemente este código está a funcionar...

int main()
{
  int a[2][2]={{1,2},{3,4}};
  int b[2][2]={{5,6},{7,8}};

  int m[4][4];

  int i,j;

  for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
      m[i][j]=a[0][i]*b[0][j];
      printf("%d | %d | %d\n",i,j,m[i][j]);
    }

  return 0;
}

a matriz A vai ocupar 4 posições de memória seguida, as duas primeiras para a primeira linha e as duas últimas para a segunda linha. se tivesses uma matriz de dimensão 1x4, ela ia também ocupar 4 posições de memória seguidas, como o C não verifica se os índices são válidos ou não, podes aceder às posições (0,2) e (0,3) sem qualquer problema.

| (0,0) | (0,1) | (1,0) | (1,1) |    -> distribuição de uma matriz 2x2 em memória

| (0,0) | (0,1) | (0,2) | (0,3) |    -> distribuição de uma matriz 1x4 em memória

repara nesse esquema como as posições (1,0) e (0,3) coincidem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já que estás com a mão na massa, importas-te de experimentar sem o [ 0 ]?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já que estás com a mão na massa, importas-te de experimentar sem o [ 0 ]?

dá erro, diz que os operandos são inválidos (para o operador *).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ia jurar que tinha usado aquilo assim num trabalho... mas devo estar a fazer confusão.

Só como nota, se fizer

m[i][j]=(*a)[i]*(*b)[i]

já funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

aparentemente este código está a funcionar...

int main()
{
  int a[2][2]={{1,2},{3,4}};
  int b[2][2]={{5,6},{7,8}};

  int m[4][4];

  int i,j;

  for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
      m[i][j]=a[0][i]*b[0][j];
      printf("%d | %d | %d\n",i,j,m[i][j]);
    }

  return 0;
}

a matriz A vai ocupar 4 posições de memória seguida, as duas primeiras para a primeira linha e as duas últimas para a segunda linha. se tivesses uma matriz de dimensão 1x4, ela ia também ocupar 4 posições de memória seguidas, como o C não verifica se os índices são válidos ou não, podes aceder às posições (0,2) e (0,3) sem qualquer problema.

| (0,0) | (0,1) | (1,0) | (1,1) |    -> distribuição de uma matriz 2x2 em memória

| (0,0) | (0,1) | (0,2) | (0,3) |    -> distribuição de uma matriz 1x4 em memória

repara nesse esquema como as posições (1,0) e (0,3) coincidem.

Obrigado pela ajuda, ainda nao percebi mt bem os indices estarem a 0, mas para o que queria esta a funcionar, estou só a experimentar subir os valores dos indices para valores superior, ainda nao acertei com o valor que queria, mas a base é esta.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando pensas numa matriz bidimensional com dimensão 3x3, m[3][3], imaginas que as posições são distribuídas assim:

m =

{0 0} {0 1} {0 2}

{1 0} {1 1} {1 2}

{2 0} {2 1} {2 2}

Como a memória do computador só tem uma dimensão, o que acontece é que as posições ficam todas seguidas, assim:

m =

{0 0} {0 1} {0 2} {1 0} {1 1} {1 2} {2 0} {2 1} {2 2}

Quando lhe acedes com indices, o que acontece em código é que o 1º índice é multiplicado pelo tamanho da linha, e depois é somado o 2º índice. Depois é acedido o elemento que está afastado esse número de posições do 1º elemento.

Por exemplo, quando escreves m[1][2] numa matriz 3x3, o deslocamento em relação ao 1º elemento é de (1*3)+2=5; ao fazeres m[ 0 ][5], o deslocamento dá (0*3)+5=5. Pegando na matriz anterior:

m[3][3] = {0 0} {0 1} {0 2} {1 0} {1 1} {1 2} {2 0} {2 1} {2 2}

m      +  0    1    2    3    4    5    6    7    8

Se pensares numa matriz bidimensional 1x9, n[1][9], imaginas a sua distribuição assim:

n[1][9] =

{0 0} {0 1} {0 2} {0 3} {0 4} {0 5} {0 6} {0 7} {0 8}

que é exactamente igual à matriz m anterior. Ao usares m[0][5], o compilador sabe que o tamanho de cada linha de m é 3, e utiliza esse valor para fazer as contas de forma a chegar ao elemento pretendido. Isto não faz diferença porque o 1º índice é 0, e assim ele não conta com o tamanho das linhas.

Atenção que se tentares aceder à matriz n com n[1][2] já não vai funcionar, porque o compilador sabe que o tamanho da linha de n é 9, e ao fazer as contas (9*1)+2=11 já vai tentar aceder a uma zona fora da memória utilizada pela matriz.

Já estou um bocado perdido e não sei o que escrever mais, e já é tarde... se tiver confundido alguma coisa, avisa :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora