Arrays (matrizes) de dimensões dinâmicas. É possível? (descrição inside)

Olá,
Tenho que implementar uma aplicação que faz operações de álgebra tensorial e estou tendo alguns problemas. Basicamente o que acontece é o seguinte:

A operação de produto tensorial, por exemplo, recebe como entrada duas matrizes e produz como resultado uma nova matriz com dimensões que sao a soma das dimensões das matrizes anteriores. Por exemplo:

entrada: a[][] , b[][] - Saída c[][][][]

ou

entrada: a[][][][], b[][] - Saída c[][][][][][]

A minha questão é: se eu criar o meu método como :

public double pTensorial (double a, double b)

e “a” e “b” forem matrizes (a[][] e b[][]), ele vai aceitar ou vai dar problema? peço isso porque não sei qual o número de dimensões das matrizes que o usuário vai passar como parâmetro e seria inviável fazer um método diferente para cada combinação de dimensões de matrizes.

Peço que notem que eu sou muito novato em programação em geral e ainda mais em java. Mas foi isso que o meu professor do mestrado pediu que fizéssemos então não tenho escolha. Espero também ter sido claro o suficiente.

Obrigado desde já!

Não estás a confundir conceitos? O que tu precisas não é simplesmente isto?

    public double[][] pTensorial (double[][] a, double b[][])  {
}

Olá pmlm, obrigado pela resposta.

Eu não posso definir o método dessa maneira porque fazendo assim o método ficaria restrito a vetores de apenas duas dimensões. Existem casos (e são muito comuns) em que o usuário irá passar como parâmetro arrays com mais dimensões, por exemplo a[][][] e b[][][], e isso resultaria em um array final de 6 dimensões, requerendo que o tipo de retorno do método fosse alterado também.

Mas 6 dimensões, como se fossem 6 planos?

Um uma matriz de 6x6?

Isso, 6 planos.

Por exemplo 5x5x5x5x5x5. Loucuras matemáticas :frowning:

Dinâmico, eu diria para tentares usar List.

[quote=pmlm]Dinâmico, eu diria para tentares usar List.
[/quote]

Aconselho o mesmo, até porque você não precisa saber quantas dimensões vai precisar. Apenas não estoure a memória ;D

[quote=jersak]Isso, 6 planos.

Por exemplo 5x5x5x5x5x5. Loucuras matemáticas :([/quote]

Posso está errado, mas a boa pratica do arrays é de apenas 3 dimensões. Não?

Não sei se é a melhor alternativa, mas você poderia dar uma olhada em reflection.

[quote=pmlm]Dinâmico, eu diria para tentares usar List.
[/quote]

Acho que o dinamismo do List não serviria para esse problema. Ele resolve quando o tamanho do array é dinâmico, mas não quando o número de dimensões é dinâmico.

Para simular um array de duas dimensões, por exemplo, teria que usar List<List>, para array de 3 dimensões, List<List<List>> e assim por diante…

Bom, resolvi o problema de uma maneira mais simples e que não tem nada a ver com a programação em si, mas com o meu entendimento do problema.
Sempre me pergunto quando algo fica muito complicado se é mesmo complicado ou se sou eu que estou fazendo de maneira errada hehe. Agradeço as respostas de todos.

Porém ainda tenho uma dúvida:

Nessa aplicação que estou desenvolvendo, o método de entrada dos dados será um arquivo de texto com várias matrizes contendo valores double. Porém, o número de matrizes não é fixo. Um arquivo pode conter tanto 2 matrizes quanto 100 por exemplo e gostaria que cada uma delas fosse armazenada em uma variável diferente.

Como faço isso se não sei quantas matrizes o usuário terá em seu arquivo de texto? Devo criar um número de variáveis reserva e torcer pra que o número de matrizes não ultrapasse esse número ou existe alguma maneira de alocar variáveis dinamicamente conforme o número de matrizes que forem lidas?

Obrigado!

Nesse caso, você pode usar a List ou outra Collection.

Não sei como você está pegando os valores e jogando em uma matriz, mas digamos que vc esteja usando uma classe chamada Matriz

Então, você cria uma lista de matrizes:

List<Matriz> matrizes = new ArrayList<Matriz>();

Cada vez que você preencher os valores dee uma matriz, você pode colocá-la na lista:

[code]

while(temMatriz){
Matriz matriz = new Matriz();
//preenche a matriz da forma que quiser
matrizes.add(matriz)
}

Nesse caso, você pode usar a List ou outra Collection.

Não sei como você está pegando os valores e jogando em uma matriz, mas digamos que vc esteja usando uma classe chamada Matriz

Então, você cria uma lista de matrizes:

List<Matriz> matrizes = new ArrayList<Matriz>();

Cada vez que você preencher os valores dee uma matriz, você pode colocá-la na lista:


List<Matriz> matrizes = new ArrayList<Matriz>();

while(temMatriz){
Matriz matriz = new Matriz();
//preenche a matriz da forma que quiser
matrizes.add(matriz)
}