Matriz de 4 dimensões

Bom dia a todos do GUJ.

Bom pessoal, antes de postar minha dúvida, vou postar o código abaixo e irei explicá-los e em seguida relato o que estou tentando fazer.

Meu código abaixo faz o seguinte.

  • Suponha que eu tenha um arquivo .csv que tenha 150 linhas e 4 colunas.
  • Então, transformo esse meu arquivo em uma matriz com as dimensões 150x4 (150 linhas e 4 colunas).
  • Nesse meu código o usuário usuário digita duas colunas (uma sendo diferente da outra) e o meu código retorna essas duas colunas.
  • Sendo assim, eu teria uma matriz de duas dimensões String[][] numeros.
String linhaCsv;
int linha  = 0;
int coluna = 0;

while ((linhaCsv = br.readLine()) != null) {
	stzr = new StringTokenizer(linhaCsv, ",");
	while (stzr.hasMoreTokens()) {			
		numeros[linha][coluna] = stzr.nextToken(); //Defino que minha matriz será de duas dimensões
		coluna++;
	}
	coluna = 0;
	linha++;
}

double coordenadaX[] = new double[linha];
double coordenadaY[] = new double[linha];

while(linha != 0){
int k = 0;
for (int i = k+count; i < coordenadaX.length; i++) {
	if(setDataset == 1){
		coordenadaX[i] = Double.parseDouble(numeros[k][a]); 
		coordenadaY[i] = Double.parseDouble(numeros[k][b]);
	}
	k++;
	
	if(linha > 0){
		linha--;
	}
}
count+= coordenadaX.length;

System.out.print("Coordenadas X:");
for (int i = 0; i < coordenadaX.length; i++) {
	System.out.print(" " + coordenadaX[i]);
}

System.out.print(" \n");

System.out.print("Coordenadas Y:");
for (int i = 0; i < coordenadaX.length; i++) {
	System.out.print(" " + coordenadaY[i]);
}

O que eu gostaria de fazer era armazenas todas essas colunas (4 no caso) em uma matriz de 4 dimensões String[][][][] numeros.

Até que consigo armaze-las, no entanto, não consigo exibir todos os elementos dessa minha matriz, tentei fazer da seguinte maneira abaixo, no entanto, não dá certo.

Alguém poderia me dizer aonde que estou errando?
Desde de já obrigado pela ajuda de todos.

String linhaCsv;
int linha  = 0;
int coluna = 0;

while ((linhaCsv = br.readLine()) != null) {
	stzr = new StringTokenizer(linhaCsv, ",");
	while (stzr.hasMoreTokens()) {			
		numeros[linha][coluna][linha][coluna] = stzr.nextToken(); //Defino que minha matriz será de quatro dimensões
		coluna++;
	}
	coluna = 0;
	linha++;
}

double coordenadaX[] = new double[linha * qntColunas]; //Múltiplo a linha pela quantidade de colunas

System.out.println();
int count = 0;
int col = 0;
while(linha != 0){
	int lin = 0;
	for (int i = lin+count; i < coordenadaX.length; i++) {
		if(setDataset == 1){
			coordenadaX[i] = Double.parseDouble(numeros[lin][col][lin][col]);
			col++;
		}
		lin++;
		
		if(col > 3){
			col = 0;
		}
		
		if(linha > 0){
			linha--;
		}
	}
	count+= coordenadaX.length;
	System.out.print("Coordenadas X:");
	for (int i = 0; i < coordenadaX.length; i++) {
		System.out.print(" " + coordenadaX[i]);
	}
}

Olá,

Evite usar “Dúvida” no títutlo. Isso é implícito.
Não entendi o motivo de você querer usar uma matriz de quatro dimensões para modelar algo que tem duas dimensões. Tente imaginar sua estrutura quadrimensional e veja se é necessário realmente uma estrutura dessa para armazenar seus dados. Eu acho que não pelo o que entendi do seu problema.

[]'s

Olá davidbuzatto.

Eu preciso armazenar todos os valores em local só para que eu possa pegar o centróide desses valores.

Estou usando essa estrutura pra que eu possa aplicar o algoritmo K-means.

[quote=jeovane.reges]Olá davidbuzatto.

Eu preciso armazenar todos os valores em local só para que eu possa pegar o centróide desses valores.

Estou usando essa estrutura pra que eu possa aplicar o algoritmo K-means.[/quote]

Vish então não posso te ajudar.

[]'s

Tranquilo davidbuzatto
Valeu por tentar ajudar :slight_smile:

Ainda não vejo porque você deva declarar uma matriz quadrimensional.

Mesmo que você vá usar o k-means. Você pode descrever melhor o seu problema para que possamos te ajudar?

Exatamente o que seus vetores representam, e o que você quer classificar?

[quote=ViniGodoy]Ainda não vejo porque você deva declarar uma matriz quadrimensional.

Mesmo que você vá usar o k-means. Você pode descrever melhor o seu problema para que possamos te ajudar?

Exatamente o que seus vetores representam, e o que você quer classificar?[/quote]

Olá ViniGodoy.
Fiz apenas com duas dimensões e acredito que esteja funcionando corretamente.

Meu código, funciona da seguinte forma, armazeno todos os valores do meu dataset em uma matriz.
Então tenho dois vetores, onde armazeno metade dos valores da matriz em um vetor e a outra metade em um outro vetor.

Caso alguém esteja afim de testar o meu código e verificar se a implementação do algoritmo K-means estar correto basta baixa-lo no link abaixo, os dataset que uso também estão no zip, basta mudar o endereço de acesso neles nas classes Kmeans e Operation.

http://br4.in/Mj96j

E se não for pedir de mais gostaria de um feedback.
Valeu pessoa pela ajuda :slight_smile:

Interessante. Eu alteraria algumas coisas:
a) Separar as operações vetoriais numa classe de vetores (isso evita ter que criar um array por dimensão e evita também poluir o código com calculeira matemática);
b) Respeitar o que diz o Javadoc e não usar o StringTokenizer. No lugar usar o método split da classe String;
c) Retirar o parse dos dados da classe KMeans.

Também fiz algumas classes para o k-means, k-nn e svm. Mas no caso eu usava para segmentar imagens.
Se quiser comparar, a do k-means e a do k-nn estão em anexo.

Bom dia ViniGodoy.

Obrigado pelo feedback, irei olhar aqui o seu código e compará-lo :slight_smile:

Desde de já obrigado pela ajuda, valeu.