Ir ao conteúdo
  • Cadastre-se
Fabio Aragao

Nomenclatura de vetores multidimensionais

Recommended Posts

Bom dia amigos,

 

Pairou uma duvida em relação aos vetores multidimensionais em C.

no que se expressa [3][3][3] seriam vetores

1 2 3     1 2 3    1 2 3

4 5 6     4 5 6    4 5 6

7 8 9     7 8 9    7 8 9

Seria isso ?? 3 vetores 3 por 3 ??

 

mas e se mudar para [3][3][4] ??

 

 

para preencher os vetores de 3x3x3

for (i=0; i<3; i++)

for (j=0; j<3; j++)

for (k=0; k<3; k++)

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fabio Aragao Suas observações estão corretas. Diz respeito as dimensões, logo uma matiz[3][3] é representável num plano 2D, onde se tem "altura x largura", e nas matrizes 3x3x3 se tem altura, largura e profundidade.

 

Mas matematicamente falando, no caso de mat[3][3][4], tem-se 4 x mat[3][3], ou "4x3" = 12 x mat[3], ou "12x3" = mat[36]; São diferentes formas de declarar o mesmo número de elementos do seu array.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
55 minutos atrás, CiroboyBR disse:

@Fabio Aragao Suas observações estão corretas. Diz respeito as dimensões, logo uma matiz[3][3] é representável num plano 2D, onde se tem "altura x largura", e nas matrizes 3x3x3 se tem altura, largura e profundidade.

 

Mas matematicamente falando, no caso de mat[3][3][4], tem-se 4 x mat[3][3], ou "4x3" = 12 x mat[3], ou "12x3" = mat[36]; São diferentes formas de declarar o mesmo número de elementos do seu array.

@CiroboyBR Obrigado por responder....

Se puder, você poderia me esclarecer algumas coisas ?

1 - [3][3][4] seria:

1 2 3     1 2 3    1 2 3    1 2 3

4 5 6     4 5 6    4 5 6    4 5 6

7 8 9     7 8 9    7 8 9    7 8 9

2 - Na matriz 3x3x3 seria 3 for e para esta 3x3x4, seriam 4 for ou 3 for com o ultimo diferenciado ??

 

No inicio da faculdade começamos com pascal, e com isso aprendemos que cada matriz(dimensão) declaravamos linha+coluna e no C é diferente.. 

Não ficou claro ainda a questão se 3x3x3 são 3 matrizes 3x3 e no caso a ultima posição controla a quantidade de dimensões ou a dimensão se dá pelo declaração [2][2][2][2] 4 matrizes 2x2. isso ainda está muito confuso na minha cabeça.

 

Obrigado pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fabio Aragao na matrix 3x3x4 seriam ainda 3 for's, só que o terceiro for percorreria 4 posições.

 

#include <stdio.h>

int vet[3][3][4];

int main() {
  int i, j, k;

  for (i = 0; i < 3; i++) {
    printf("\n\nMatriz %d\n", i);
    for (j = 0; j < 3; j++) {
      printf("\n");
      for (k = 0; k < 4; k++) {
        printf("%3d ", vet[i][j][k]);
      }
    }
  }

  return 0;
}



 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, CiroboyBR disse:

@Fabio Aragao na matrix 3x3x4 seriam ainda 3 for's, só que o terceiro for percorreria 4 posições.

 


#include <stdio.h>

int vet[3][3][4];

int main() {
  int i, j, k;

  for (i = 0; i < 3; i++) {
    printf("\n\nMatriz %d\n", i);
    for (j = 0; j < 3; j++) {
      printf("\n");
      for (k = 0; k < 4; k++) {
        printf("%3d ", vet[i][j][k]);
      }
    }
  }

  return 0;
}


 

@CiroboyBR Então de qualquer forma seriam 3 matrizes.... sendo que a ultima com um trato especial... beleza.. entendi..

Agora, é correto afirmar que a linguagem faz um trato especial para formar as matrizes, ou seja:

para matriz bidimensional matriz[2][2] temos duas linhas e duas colunas.. está sendo declarado igual pascal ou é o fato de temos dois vetores que pelo " estrutura de repetição for" eu trato como linha e coluna ?

 

e no caso das matrizes tridimensionais em diante, como é tratado o fato da linha e da coluna, se for negativa a pergunta acima. ou seja, [3][3][3][3] onde está explicito o fato que são 3 linhas e 3 colunas ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

pense em arrays e tudo será mais fácil. Por exemplo temos o array normal char array[100];. Logo temos o array bidimensional, char array[2][100];, agora você tem 2X100 chars, ou seja, você pode guardar 2 frases de 100 letras.

Agora vamos ver o tridimensional... imagine que você tem 5 paginas onde cada pagina você tem 2 linhas que te permitem conter frases de 100 letras cada uma, isso seria algo como char array [5][2][100];
Agora vamos pensar que temos 10 livros com 5 paginas cada, e que cada pagina tenha 2 linhas que te permitem guardar uma frase de 100 letras em cada linha: char array[10][5][2][100], isso são 4 dimensões. E se agora tivesse 2 bibliotecas que contenham a mesma quantidade de livros? char array[2][10][5][2][100].... e assim por diante.
 

São conhecidos como arrays e arrays multidimensionais o que conhecemos como vetor e matrizes.
const int BIBLIOTECAS = 2;
const int LIVROS = 10;

const int PAGINAS = 5;

const int LINHAS = 2;

const int LETRAS = 100;
char biblioteca[BIBLIOTECAS][LIVROS][PAGINAS][LINHAS][LETRAS];

Acho que fica claro.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
45 minutos atrás, vangodp disse:

pense em arrays e tudo será mais fácil. Por exemplo temos o array normal char array[100];. Logo temos o array bidimensional, char array[2][100];, agora você tem 2X100 chars, ou seja, você pode guardar 2 frases de 100 letras.

Agora vamos ver o tridimensional... imagine que você tem 5 paginas onde cada pagina você tem 2 linhas que te permitem conter frases de 100 letras cada uma, isso seria algo como char array [5][2][100];
Agora vamos pensar que temos 10 livros com 5 paginas cada, e que cada pagina tenha 2 linhas que te permitem guardar uma frase de 100 letras em cada linha: char array[10][5][2][100], isso são 4 dimensões. E se agora tivesse 2 bibliotecas que contenham a mesma quantidade de livros? char array[2][10][5][2][100].... e assim por diante.
 

São conhecidos como arrays e arrays multidimensionais o que conhecemos como vetor e matrizes.
const int BIBLIOTECAS = 2;
const int LIVROS = 10;

const int PAGINAS = 5;

const int LINHAS = 2;

const int LETRAS = 100;
char biblioteca[BIBLIOTECAS][LIVROS][PAGINAS][LINHAS][LETRAS];

Acho que fica claro.

@vangodp Sim, fica claro.. está ajudando bastante...

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fabio Aragao Ao que parece, a maneira que o C armazena arrays multidimensionais(matrizes), é da forma linear. Infelizmente eu nunca vi uma literatura do C que abordasse esse assunto(Mas quem sabe exista).

Eu pude perceber isso fazendo testes, veja esse código, acho que ele se auto explica quando compilado.

 

#include <stdio.h>

void preenche();
void imprime();

int vet[3][3][4];
int i, j, k;
//MAIN
int main() {
  preenche();
  imprime();

  int *p = (int*)(&vet);

  printf("\n\nvetor linear 1: %2d", *(p + 20)); // Demonstrandro que mesmo sendo uma matriz de 3 dimensões, ainda sim
  printf("\n\nVetor linear 2: %d", vet[0][0][20]); // a matriz é armazenada como um array linear.

  printf("\n\nLinha positiva: %d", vet[2][2][0]); //linha normal
  printf("\n\nLinha negativa: %d", vet[2][2][-1]); //linha negativa
  printf("\n\nLinha negativa: %d", vet[2][2][-2]); //linha negativa


  return 0;
}

void preenche() {
  int contador = 200;
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      for (k = 0; k < 4; k++) {
        vet[i][j][k] = contador;
        contador++;
      }
    }
  }
}

void imprime() {
  for (i = 0; i < 3; i++) {
    printf("\n\nMatriz %d\n", i);
    for (j = 0; j < 3; j++) {
      printf("\n");
      for (k = 0; k < 4; k++) {
        printf("%3d ", vet[i][j][k]);
      }
    }
  }
}

 

Editado por CiroboyBR
EDITADO

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, CiroboyBR disse:

@Fabio Aragao Ao que parece, a maneira que o C armazena arrays multidimensionais(matrizes), é da forma linear. Infelizmente eu nunca vi uma literatura do C que abordasse esse assunto(Mas quem sabe exista).

Eu pude perceber isso fazendo testes, veja esse código, acho que ele se auto explica quando compilado.

Eu acho que ja falei sobre o assunto em algum outro tema deste fórum...
As matrizes são lineares sim. Uma matriz é um vetor de vetores... lembre disso. Que quer dizer isso? Que toda matriz por muita matriz que seja, na realidade ela é um vetor. Isso não aparece tão fácil em internet porém eu posso lhe explicar o por quê. Toda a matriz é um vetor(linear) porque a memória RAM é linear, no fundo uma matriz de [3][3][3] não passa de um vetor de 3*3*3 que traduzido é um vetor de 27 casinhas, porém cada uma fica atrás da outra de forma organizada "em linha" porque a memória é em linha, a memória não é "bidimensional" por esse motivo você pode fazer coisas como:

2 horas atrás, CiroboyBR disse:

...
  printf("\n\nvetor linear 1: %2d", *(p + 20)); // Demonstrandro que mesmo sendo uma matriz de 3 dimensões, ainda sim
  printf("\n\nVetor linear 2: %d", vet[0][0][20]); // a matriz é armazenada como um array linear.

  printf("\n\nLinha positiva: %d", vet[2][2][0]); //linha normal
  printf("\n\nLinha negativa: %d", vet[2][2][-1]); //linha negativa
  printf("\n\nLinha negativa: %d", vet[2][2][-2]); //linha negativa
...

 

 

Em outras palavras veja esse exemplo:
 

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

int main (){
    char matriz[3][3][3] = {
        {{ 1, 2, 3},{ 4, 5, 6},{ 7, 8, 9}},
        {{10,11,12},{13,14,15},{16,17,18}},
        {{19,20,21},{22,23,24},{25,26,27}}
    };
    int i;
    for (i = 0; i< 3*3*3; i++) {
        printf("%2d, ", matriz[0][0][i]);
    }
    
    getchar();
    return 0;
}

quando eu imprimo a matriz tal como matriz[0][0] no laço for, podemos perceber 2 coisas, primeiramente que uso um só for e não 3, e segundo que trato a matriz como si fosse um vetor (matriz[0][0]) isso faz com que a matriz seja imprimida tal como ela está na memória RAM, ou seja, na ordem em que está armazenada, pois vetores e matriz não passam de um conjunto de variáveis com alguma forma de organização, o segredo consiste em nós saber-nos como é essa organização.
Na verdade a matriz[3][3][3]
        {{ 1, 2, 3},{ 4, 5, 6},{ 7, 8, 9}},
        {{10,11,12},{13,14,15},{16,17,18}},
        {{19,20,21},{22,23,24},{25,26,27}}

...não passa de...
matriz[3*3*3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27}


...por causa das limitações físicas da memória(linear). Se em vez de imprimir os valores imprimimos as direções de memória, nos daríamos conta da organização que tem a matriz, por isso em alguns casos podemos acessar a partes do vetor com valores negativos, na realidade nós só não deveríamos acessar a posição menor que zero, porém isso não é exatamente certo, imagine que nós reservássemos 2 vetores de forma consecutiva, podíamos trata-los como uma matriz, isso não é um erro.
Pense em uma imagem, toda imagem é uma matriz, porém tratar matrizes tem um custo mais elevado que tratar vetores, tudo se traduz em eficiência, com esse sistema de poder tratar uma matriz como um vetor aproveitando a estrutura da memória, ganhamos em eficiência, pois processar um vetor é mais rápido que processar uma matriz.

Pense que a memória começa na posição 0x0 e termina na posição 0x...(dependendo da quantidade de RAM que tenha seu computador), por isso a memória é sim linear, ela começa em 0 e termina em X, onde X é o tamanho da final RAM. O criador de C se deu conta disso, e resolveu tirar vantagem, por esse motivo C é muito mais poderoso que outras linguagens, em Java por exemplo é como andar em bicicleta com rodinhas, se nós sairmos do índice o próprio linguagem te avisa, porém em C somos nós que devemos ter claro a estrutura da memória para não cometer erros, porém podemos aproveitar a estrutura da memória em vários casos para nosso beneficio se conhecemos e sabemos como faze-lo.

Espero ter ajudado ;)
arraysja.gif

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Explicações, simples, didáticas e que fazem total sentido.. e concordo que se tratando de "matrizes" as literaturas não abordam com profundida..

 

Duvida totalmente solucionada...

 

Obrigado amigos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

talvez sejam conceitos algo avançados para quem está começando, porém salve-o em algum lugar donde você possa fazer alguma consulta futura. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp Sabe o que eu vejo hoje nas faculdades, é que o professor tem MUITO conhecimento mas não tem didática...

Entre os amigos, comentamos sobre as matérias e sobre os professores e chegamos a conclusão deste fato, falta didática em muitos professores. Creio que nem cabe a questão de que temos que nos esforçar, isso é fato, temos sim.. mas se a matéria é longa.. divida dentro da grade.. se temos o problema de nivelamento dos alunos, creio eu, que uma boa equipe pedagógica resolveria 40% deste problema..... e fato é.. professores diferentes que lecionam a mesma matéria conseguem resultados diferentes com turmas diferentes... então, na minha ignorância, não cola o fato de que a culpa é do tempo que é curto ou do aluno que não se esforça, aceitaria a segunda opção se o mapa da média da turma estivesse no MINIMO um pouco abaixo da média.. e não BASTANTE abaixo da média...

Sempre recorri a este forum e sempre fui bem atendido, não vão me dar resposta pronta e acho isso muito justo, tenho que me esforçar para aprender, e forum foi feito para discutir duvidas, e não ter o trabalho pronto. Com isso tenho crescido nas áreas que tenho dificuldades. Eu só tenho a agradecer pela ajuda que sempre recebi de vocês.. e com isso tento ajudar outros colegas que tem dificuldades.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, Fabio Aragao disse:

e com isso tento ajudar outros colegas que tem dificuldades.

Isso está muito bem ;) faça isso.

Para ser-lhe sincero eu nem passei pela universidade, nem sequer terminei a 6ª serie, programar não é meu ganha pão, isso eu faço por "prazer", hobby ou chame como quiser, é algo que eu sempre quis fazer e faço, sei que nunca vou conseguir um bom trabalho porém onde quero chegar é a dizer que não dependa somente do seu professor, seja uma esponja claro, aprenda tudo o que ele quer te ensinar, mas saiba que o maior dom de um programador é a auto pesquisa, ja seja em fórum ou internet, também em vídeos, etc. Não desista nunca! ;) 
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×