Matriz por parametro [Resolvido]

olá! :smiley:

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

[code]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]);
}
}[/code]

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.

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

[quote=dfarias]cara… não é um vetor(unidimensional), mas sim uma matriz(vetor bidimensional).
[/quote]

:frowning: 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()):

[code]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;
}[/code]

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.

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

[code]public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){

}  [/code]

[quote=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?

[code]public static int[][] criarMatrizAPartirDePedacoOutra(int[][] matriz, int x, int y, int linhas, int colunas){

}  [/code][/quote]

As respostas são “sim” e “sim”

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

Ele lhe respondeu antes de você perguntar :slight_smile:

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

no caso, como seria a implementação da chamada do metodo criarMatrizAPartirDePedacoOutra?
vc nao precisaria de dois laços de repetição abaixo?

[code]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);

}}
[/code]

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

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++) { [...]

[quote=entanglement]Eu digo que para entender direitinho trabalhar com matrizes, você precisa de lápis, papel e desenhar as matrizes.
[/quote]

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?

[quote=dfarias][quote=entanglement]Eu digo que para entender direitinho trabalhar com matrizes, você precisa de lápis, papel e desenhar as matrizes.
[/quote]

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? [/quote]
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:

[code]
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;
}

}[/code]

Abraços.

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

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

[/quote]

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.

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!! }

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 [i]vetorCalc(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:

[code]
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
}

}

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

Abraço.

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.

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.