Pular para o conteúdo

Criar matrizes muito grandes [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Criar matrizes muito grandes [RESOLVIDO]

Enviado em 28/11/2020 - 14:49h

Boa tarde.
Eu preciso de 3 matrizes com 40 000 linhas e 40 000 colunas cada ([40000][40000]).
Alguém sabe como eu posso fazer isso.
Tentei alocação estática e não funcionou (definir as matrizes antes da função main).
Se alguém souber vi o eu posso fazer isso, serei eternamente grato.

Responder tópico

2. Re: Criar matrizes muito grandes [RESOLVIDO]

Melhor resposta

Enviado em 30/11/2020 - 11:41h

Estou num celular, então posso errar alguma sintaxe.

#define TAM_X 40000
#define TAM_Y 40000
double *p = (double *)malloc(TAM_X * TAM_Y * sizeof(double));

Ou
#define TAM_X 40000
#define TAM_Y 40000
double **p = (double **)malloc(TAM_X * sizeof(double *));
for (int i=0;i< TAM_X;i++)
p[i] = (double *)malloc(TAM_Y * sizeof(double));

Dependendo de como é seu estilo de codificação vc usa um ou outro. Como o colega falou suas matrizes estão muito grandes. O gcc adicionou um monte de verificação em tempo de compilação e memm max pode ser uma delas, ou seja, vc pode não conseguir compilar seu código ou então desabilitar algumas flags.

4. Como fazer isso em C++

Enviado em 30/11/2020 - 10:41h

Valeu pela dica :)
Só que depois eu vi que meu codigo esta em C++ e eu tentei usar esse método de alocacao dinamica e nao funcionou. Fiz o seguinte:

int main(){
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);
double (*q_matriz)[40000][40000]=malloc(sizeof *q_matriz);
double (*r_matriz)[40000][40000]=malloc(sizeof *r_matriz);
double (*s_matriz)[1000][1000]=malloc(sizeof *r_matriz);
#define m (*p_matriz)
#define t1 (*q_matriz)
#define t2 (*r_matriz)
#define ma (*s_matriz)

// . . .
free(p_matriz);
free(q_matriz);
free(r_matriz);
free(s_matriz);


Aparece a seguinte mensagem de erro:
invalid conversion from ‘void*’ to ‘double (*)[40000][40000]’ [-fpermissive]
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);

OBS: ESTOU ESCREVENDO EM C++.

5. Re: Criar matrizes muito grandes

Enviado em 30/11/2020 - 10:56h

Uma coisa que você não notou, é que: 40000 x 40000 dá exatos 6,4x10^13, ou melhor, são 64'000'000'000'000 elementos numa única matriz.
O que isso significa?
Que se você usar um double comum de 8 bytes cada, você vai precisar de 6,4x10^2 vezes 8 bytes para alocar tudo isso.
Ou melhor, a não ser que você tenha um computador da nasa (não estou brincando) você não conseguirá usar nem alocar tal matriz.
6,4x10^2 vezes 8 bytes são 512'000'000'000'000 bytes
Ou seja, 512TB de memória necessários pra armazenar tal matriz.

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://cpusam.github.io/

6. Re: Criar matrizes muito grandes [RESOLVIDO]

Enviado em 30/11/2020 - 11:39h

entao, eu fiz um rascunho em C usando alocacao dinamica e deu certo. Eu so preciso saber como fazer a alocacao dinamica em C++

7. Re: Criar matrizes muito grandes

Enviado em 30/11/2020 - 12:24h

linersantos escreveu:

entao, eu fiz um rascunho em C usando alocacao dinamica e deu certo. Eu so preciso saber como fazer a alocacao dinamica em C++
Em c para se alocar a memoria de um vetor, por exemplo, normalmente seria assim:
#define LENGTH 5
int *vet = (int *) malloc(LENGTH * sizeof(int));

Em c++ isso seria o equivalente a fazer:
int *vet = new int[LENGTH];

8. Re: Criar matrizes muito grandes [RESOLVIDO]

Enviado em 30/11/2020 - 12:34h

linersantos escreveu:

Valeu pela dica :)
Só que depois eu vi que meu codigo esta em C++ e eu tentei usar esse método de alocacao dinamica e nao funcionou. Fiz o seguinte:

int main(){
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);
double (*q_matriz)[40000][40000]=malloc(sizeof *q_matriz);
double (*r_matriz)[40000][40000]=malloc(sizeof *r_matriz);
double (*s_matriz)[1000][1000]=malloc(sizeof *r_matriz);
#define m (*p_matriz)
#define t1 (*q_matriz)
#define t2 (*r_matriz)
#define ma (*s_matriz)

// . . .
free(p_matriz);
free(q_matriz);
free(r_matriz);
free(s_matriz);


Aparece a seguinte mensagem de erro:
invalid conversion from ‘void*’ to ‘double (*)[40000][40000]’ [-fpermissive]
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);

OBS: ESTOU ESCREVENDO EM C++.
Você está fazendo a alocação da matriz de maneira errada
Vou enviar um video muito bom do professor Backes onde ele mostra exatamente como fazer isso:
https://www.youtube.com/watch?v=W4vbwEJn11U

O que você precisa aprender começa a partir de 1:51

9. Re: Criar matrizes muito grandes [RESOLVIDO]

Enviado em 30/11/2020 - 13:29h

Bacagine escreveu:

linersantos escreveu:

entao, eu fiz um rascunho em C usando alocacao dinamica e deu certo. Eu so preciso saber como fazer a alocacao dinamica em C++
Em c para se alocar a memoria de um vetor, por exemplo, normalmente seria assim:
#define LENGTH 5
int *vet = (int *) malloc(LENGTH * sizeof(int));

Em c++ isso seria o equivalente a fazer:
int *vet = new vet[LENGTH];

Em c++ a sintaxe é mais próxima de java. Então é assim q deve ser feito.
Outra coisa q lembrei é que o próprio sistema coloca limite nos recursos usados pelos usuários., senão um úbico usuário pode travar o sistema

https://www.dicas-l.com.br/arquivo/como_impedir_a_bomba_fork___atraves_da_limitacao_dos_recursos_de_...

10. Re: Criar matrizes muito grandes [RESOLVIDO]

Enviado em 01/12/2020 - 11:28h

Obrigado a todos pelas valiosas dicas e eis como eu escrevi para o caso de alguem precisar futuramente.

//...
int main(){
#define tamx 50000
#define tamy 50000
#define trento 210
double **m = (double **)malloc(tamx * sizeof(double *));
double **t1 = (double **)malloc(tamx * sizeof(double *));
double **t2 = (double **)malloc(tamx * sizeof(double *));
double **ma = (double **)malloc(trento * sizeof(double *));
for(int i = 0; i<tamx; i++){
m[i] = (double *)malloc(tamy * sizeof(double));
t1[i] = (double *)malloc(tamy * sizeof(double));
t2[i] = (double *)malloc(tamy * sizeof(double));
}
for(int i = 0; i< trento; i++){
ma[i] = (double *)malloc(trento * sizeof(double));
}
//...
free(ma);
free(m);
free(t1);
free(t2);

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder