Matriz por parametro [Resolvido]

21 respostas
dfarias

olá! :D

eu quero passar uma parte da matriz para uma determinada classe.

int k=0;
int d=0;

 for (k<somaPorThread; k++) {
                for (d<somaPorThread; d++) {
                    vetorCalc[i].setMatriz1(d, k, m1[d][k]);
                    vetorCalc[i].setMatriz2(d, k, m2[d][k]);
                }
            }

21 Respostas

TerraSkilll

dfarias
Dê uma olhada na classe Arrays do pacote java.utils. O método copyRange deve ser o que você precisa (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOfRange%28int[],%20int,%20int%29). Como ele opera sobre matrizes de 1 dimensão, você pode ter que criar um método para montar outra matriz multidimensional, se for o caso.

Em código, deve ficar algo assim:

import java.util.Arrays;

public class Teste{
public static void main(String args[]){
  int[] matriz = new int[10];
  // aqui preenche a matriz acima;
  matrizdivA = Arrays.copyOfRange(matriz, 0, 4);
  matrizdivB = Arrays.copyOfRange(matriz, 5, 9);

  calcular(matrizdivA, matrizdivB);
}

public void calcular(int[] matriza, int[] matrizb){
  // calcula alguma coisa
}

}

Abraço.

dfarias

cara… não é um vetor(unidimensional), mas sim uma matriz(vetor bidimensional).

TerraSkilll
dfarias:
cara... não é um vetor(unidimensional), mas sim uma matriz(vetor bidimensional).

:( Sim, por isso comentei:

Como ele opera sobre matrizes de 1 dimensão, você pode ter que criar um método para montar outra matriz multidimensional, se for o caso.

Mas, se sua dificuldade é justamente essa, tente algo do tipo (nem usa o copyOfRange()):
public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){
  		int[][] resultado = new int[x + linhas][y + colunas];
  		
  		for (int i = x; i < x + linhas; i++)
    		for (int j = y; j < y + colunas; j++)
    			resultado[i][j] = matriz[i][j];

  		return resultado;
  	}
Note que, como estamos falando de matrizes (mais de 1 dimensão), você tem que pegar a faixa de elementos em duas dimensões (começa na posição x e y, e vai até x + 3, y + 3). Por isso o método tem 5 parâmetros.

Abraço.

dfarias

eu nao entendi essa parte abaixo. pq vc declara o metodo int[][]. é pq o retorno é uma matriz? e pode retornar uma matriz inteira assim?

public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){  
          
    }
E
dfarias:
eu nao entendi essa parte abaixo. pq vc declara o metodo int[][]. é pq o retorno é uma matriz? e pode retornar uma matriz inteira assim?
public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){  
          
    }

As respostas são "sim" e "sim"

dfarias

TerraSkill,
Eu vou ser honesto com vc. Eu não entendi pra que tantos parametros. :?

E

Ele lhe respondeu antes de você perguntar :slight_smile:

dfarias

mas eu perguntei novamente, pq eu nao entendi de fato. :shock:

dfarias
no caso, como seria a implementação da chamada do metodo criarMatrizAPartirDePedacoOutra? vc nao precisaria de dois laços de repetição abaixo?
Matriz matriz = new Matriz();
for (int i = x; i < x + linhas; i++)  {
          for (int j = y; j < y + colunas; j++)  {

 matriz.criarMatrizAPartirDePedacoOutra(m1, x, y, linhas, colunas);

}}
E

Eu digo que para entender direitinho trabalhar com matrizes, você precisa de lápis, papel e desenhar as matrizes.

dfarias

alguém poderia me explicar esse pedaço do código?:

for (int i = x; i < x + linhas; i++) { for (int j = y; j < y + colunas; j++) { [...]

dfarias

entanglement:
Eu digo que para entender direitinho trabalhar com matrizes, você precisa de lápis, papel e desenhar as matrizes.

bom. eu enxergo a necessidade dos paramentros: i, j, valor. agora pra que x+linhas e y+colunas? é pra dizer até onde vai a matriz, ate que ponto ela ser preenchida?

TerraSkilll
dfarias:
entanglement:
Eu digo que para entender direitinho trabalhar com matrizes, você precisa de lápis, papel e desenhar as matrizes.

bom. eu enxergo a necessidade dos paramentros: i, j, valor. agora pra que x+linhas e y+colunas? é pra dizer até onde vai a matriz, ate que ponto ela ser preenchida?


Basicamente, é pra dizer o tamanho dela.

Fiz um teste aqui e meu código, apesar de funcionar, apresenta uma inconsistência lógica. Eu alterei, mas os parâmetros continuam os mesmos. Eis o exemplo completo, pra você testar e entender:

public class ArrayRange {

    public static void main(String args[]){
    	int[][] mat = new int[10][10];
    	
    	for (int i = 0; i < mat.length; i++)
    		for (int j = 0; j < mat[i].length; j++)
    			mat[i][j] = (int) (Math.random() * 100); // preenche a matriz com valores aleatórios

		// imprime a matriz mat
    	for (int i = 0; i < mat.length; i++){
    		for (int j = 0; j < mat[i].length; j++){
    			System.out.print(mat[i][j] + " - ");
    		}
    		System.out.print("\n");
    	}

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

		// gera uma nova matriz com um pedaço da anterior
		int res[][] = criarMatrizAPartirDePedacoOutra(mat, 0, 0, 3, 3); // mude os numeros aqui e veja a diferença
		
		// imprime a matriz gerada    	
    	for (int i = 0; i < res.length; i++){
    		for (int j = 0; j < res[i].length; j++){
    			System.out.print(res[i][j] + " - ");
    		}
    		System.out.print("\n");
    	}
    	
    	System.exit(0);
    }

	// o retorno da função é int[][] porque a função retorna uma matriz
    public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){
  		int[][] resultado = new int[linhas][colunas]; // cria uma matriz linhasXcolunas
  														// se x=1, y=1, colunas=3, linhas =3,
  														// a matriz "resultado" criada é 3x3, e os elementos a serem 
  														// pegos da matriz original vão da posição 1x1 até a 4x4

  		for (int i = 0; i < resultado.length; i++)
    		for (int j = 0; j < resultado[i].length; j++)
    			resultado[i][j] = matriz[i + x][j + y];

  		return resultado;
  	}
}

Abraços.

dfarias

TerraSkill,
Eu vou usar seu código pra tentar entender.
Mas, não seria for (int j = 0; j < mat.length; j++)?

TerraSkilll

dfarias:
TerraSkill,
Eu vou usar seu código pra tentar entender.
Mas, não seria for (int j = 0; j < mat.length; j++)?

Taí uma coisa pra você testar :smiley: .

Altere e teste com uma matriz 10x10, depois com uma 10x2, e depois com uma 2x10.

Abraço.

dfarias

Consegui entender. Mas agora eu tenho outra dúvida. E no caso de múltiplas instâncias?

Calculadora[] vetorCalc = new Calculadora[somaPorThread]; for (int i= 0; i<vetorCalc.length; i++) { vetorCalc[i]=vetorCalc[i](m1, 0, 0, 3, 3);//tá dando erro nessa parte!! }

TerraSkilll

dfarias
Esse código que você postou, sozinho e isolado, não diz muita coisa. Por exemplo, o que faz a Calculadora? E o que significa vetorCalc[i](m1, 0, 0, 3, 3) ? Por que esse i aí? Quando você diz múltiplas instâncias, são múltiplas instâncias de quem exatamente?

Se entendi o que você quer fazer, é somar as partes de uma matriz usando threads, certo?

Você precisa dividir as coisas. Do jeito que está tentando fazer, está muito confuso.

Exemplo:
public class Teste{
  public static void main(String args[]){
    // uma matriz grande, de 100x100, 
    //que queremos somar em pedaços de 10x10
    int[][] matriztoda = new int[100][100];

    // uma lista contendo as threads que realizarão a soma
    List<Calculadora> somadoras = new ArrayList<Calculadora>(); 
 
    // note que o for é de 10 em 10,
    // porque queremos pedaços de 10 em 10
    for(int i = 0; i < 100; i+=10{
      for(int j = 0; j < 100; j+=10{
        somadoras.add(new Calculadora(criarMatrizAPartirDePedacoOutra(matriztoda, i, i, i+10, j+10)));
      }
    }

    for(Calculadora soma : somadoras{
      soma.start(); // o método start inicia uma thread
    }
  }

  public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){
    // esse método a gente já tem e você já sabe como funciona, certo?
  }

  // esta classe interna faz um calculo qualquer na matriz
  class Calculadora extends Thread{
    int[][] matrizinternadathread;

    public Calculadora(int[][] matriz){
      matrizinternadathread = matriz;
    }

    public void run(){
      // aqui você realiza o cálculo que quiser com o pedaço da matriz que você mandou
      // pode ser uma soma, multiplicação, divisão, jogar tudo fora, etc
    }
  }

}
Nota: o código acima não compila. É um exemplo de como você pode estruturar a coisa toda.

Abraço.

regis_hideki

Isso que você quer fazer é uma especificação, ou você que enxergou o problema e viu que deveria ser feito dessa forma? Se for a segunda opção, provavelmente, há formas mais fáceis de se resolver.

TerraSkilll

A pergunta foi pra mim ou pro dfarias?

Se foi pra mim, como eu não sei o que ele precisa exatamente, estou propondo soluções baseado no que imagino que ele precise. Mas imagino também que haja soluções mais simples, e talvez mais fáceis também.

Abraço.

regis_hideki

A pergunta foi pra mim ou pro dfarias?

Se foi pra mim, como eu não sei o que ele precisa exatamente, estou propondo soluções baseado no que imagino que ele precise. Mas imagino também que haja soluções mais simples, e talvez mais fáceis também.

Abraço.

Foi pro dfarias. Se não for uma especificação rígida que diga que os parâmetros devem ser passados dessa forma, ele pode dar mais detalhes que nos permitam ajudar a propor uma solução melhor.

dfarias

Eu quero criar multiplas threads, cada thread vai somar uma certa quantidade de elementos da matriz A e da matriz B.

por exemplo, eu tenho uma matriz de cinco linhas e cinco colunas. Eu digo que haverá 5 threads, cada thread deve calcular 5 elementos.

Eu estou com problema na parte abaixo, pois só um thread está sendo criada.

for(Calculadora soma : somadoras{ soma.start(); // o método start inicia uma thread }

Criado 25 de outubro de 2012
Ultima resposta 31 de out. de 2012
Respostas 21
Participantes 4