Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-02-2012, 01:24   #1
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Raggruppare celle di una matrice ad n^2 alla volta

Mi spiego ho una matrice di una qualsivoglia dimensione, mettiamo che sia 5 righe e 5 colonne.
Vorrei scorrere la matrice in maniera tale da leggere n celle per volta che siano allineate a formare un quadrato, ovvero se n è uguale a 2 voglio leggere:

cella riga i colonna j
cella riga i colonna j+1
cella riga i+1 colonna j
cella riga i+1 colonna j+1

Come posso fare?

Per altro se la matrice è 5x5 ed n è 2 allora allora voglio leggere [0][0] [0][1] [1][0] [1][1], poi [0][2] [0][3] [1][2] [1][3] e poi alla fine della riga voglio leggere solo [4][0] [4][1].

Idem per l'ultima riga dove avrò invece da leggere i nodi a due a due. Non so se mi spiego. Ci sto davvero perdendo la testa quindi qualsiasi suggerimento è ben accetto
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 14:41   #2
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
Per cosa ti serve ?

Cmq nell'esempio che hai riportato, all'ultima riga non hai mica un quadrato...se N è 3 che dovrebbe fare ?
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 16:46   #3
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Non mi pare che si possa fare niente di diverso da

Codice:
for i = 0 to n-1
   for j = 0 to n-1
      quadrato[i][j] = matrice[i][j]
   endfor
endfor
cioè praticamente non puoi fare altro che scorrere le prime n righe e leggerti le prime n colonne per ogni riga

se stai pensando a qualcosa tipo memcpy, ti faccio notare che le matrici in genere sono organizzate come vettori di vettori, cioè vengono memorizzate contiguamente tutte le righe, ognuno c'avrà le sue m colonne

quindi facendo memcpy, andresti a leggere n righe x m colonne e non nxn come vuoi fare tu

potresti al massimo leggerti con memcpy n righe per ogni colonna, però ci vuole comunque almeno un for

insomma devi saltare, per ogni riga, le ultime (m-n) colonne
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 17:17   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
@guylmaster: forse potresti ottenere risposte più circostanziate se scrivessi tutto in un solo thread, così chi ti legge può capire l'intero problema e il suo contesto e aiutarti meglio a trovare una soluzione.

Se devi lavorare con le matrici, fatti una classe ad-hoc per wrappare gli array di array nudi&crudi e definisciti dei metodi di utilità.
Ad esempio, guarda questo vecchio thread
Potresti ad esempio implementare un metodo (getSubRegion) che accetta le coordinate di una cella della matrice (riga,colonna) e la dimensione della sotto-regione (voglio una 9x9, quindi un dim=3) desiderata e che restituisce la sottoregione.

Se le coordinate (riga, colonna) assieme alla dimensione della sottoregione (dim) definiscono una sottoregione che "cade parzialmente fuori" della regione allora potresti riempire i valori delle celle "invalide" con un valore dummy che decidi te, o fare altro: tutto dipende da cosa devi fare in ultima analisi: cioè quale problema stai risolvendo?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 24-02-2012 alle 17:26.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 19:32   #5
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Allora il problema che sto risolvendo, ed in caso potesse essere utile specifico che lo sto risolvendo in Java, è quello di avere una mappa rappresentata tramite una matrice e devo rappresentare su questa mappa delle rotte.

Per rappresentare delle rotte, sopratutto per mappe molto grandi, devo poter raggruppare assieme più celle della mappa originale andandomi a creare una mappa virtuale rappresentata da una matrice più piccola.

Non sto riuscendo ad abbozzare nessun conduce e sto avendo un po' di difficoltà. Ora comunque mi leggo la discussione che mi hai citato.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 20:41   #6
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Ho provato a buttare giù questo codice ma mi sono accorto che le prende male e che ho sbagliato il ragionamento, però magari potrebbe essere un inizio "da correggere" :

Codice:
package lettura_mappa;

import java.util.ArrayList;

public class Partiziona_matrice {
	public Partiziona_matrice() 
	{
		
	}
	public ArrayList<ArrayList<Coppia>> partiziona(int n, int righe, int colonne)
	{
		ArrayList<ArrayList<Coppia>> partizione = new ArrayList<ArrayList<Coppia>>();
		
		int cella= 0;
		int r= 0;
		int c = 0;
		float rc = righe * colonne;
		float numero_celle = (float)Math.ceil((rc/n) );
		while(cella < numero_celle)
		{
			int righe_prese = 0;
			int colonne_prese = 0;
			ArrayList<Integer> rp = new ArrayList<Integer>();
			ArrayList<Integer> cp = new ArrayList<Integer>();
			ArrayList<Coppia> nodi_cella = new ArrayList<Coppia>();
			
			int i = 0;
			while(r < righe && righe_prese < n)
			{
				rp.add(i, r);
				i++;
				r++;
				righe_prese++;
			}
			int j = 0;
			while(c < colonne && colonne_prese < n)
			{
				cp.add(j, c);
				j++;
				c++;
				colonne_prese++;
			}
			
			for (int k = 0; k < rp.size(); k++) {
				for (int h = 0; h < cp.size(); h++) {
					nodi_cella.add(new Coppia(rp.get(k), cp.get(h) ));
				}
				
			}
			partizione.add(nodi_cella);
			cella++;
		}
		
		
		return partizione;
	}
	
	public static void main(String [] args)
    {
		Partiziona_matrice pa = new Partiziona_matrice();
		System.out.println(pa.partiziona(2, 5, 5));
	}

}
Così facendo mi ritorna:
Codice:
[[(0,0), (0,1), (1,0), (1,1)], [(2,2), (2,3), (3,2), (3,3)], [(4,4)], [], [], [], [], [], [], [], [], [], []]
E non va bene.

Un'altra idea che mi sta venendo in mente è che scrivo prima tutte le coppie riga e colonna in una lista e poi mi invento un modo per "partizionare" la lista in modo corretto. Voi avete qualche suggerimento?
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 23:23   #7
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Potresti ad esempio implementare un metodo (getSubRegion) che accetta le coordinate di una cella della matrice (riga,colonna) e la dimensione della sotto-regione (voglio una 9x9, quindi un dim=3) desiderata e che restituisce la sottoregione.
Quoto, scomponendolo il problema è molto più semplice di quello che sembra.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2012, 23:52   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se prendi un rettangolo e pensi "adesso me lo scorro in porzioni di larghezza W e altezza H" che fai? Disegni un rettangolo 0,0,W,H e lo sposti orizzontalmente di W unità finchè non arrivi alla fine della riga. Quando sei lì ti sposti di H unità in basso e riparti da x=0 fino alla fine della riga a passi di W unità.

Detto altrimenti, il ciclo che faresti per scandire l'intera matrice:

Codice:
for(int r = 0; r < rowCount; r++) {
    for(int c = 0; c < colCount; c++) {
    }
}
altro non è che un caso particolare di lettura di una sottomatrice:

Codice:
Cella start = new Cella(riga, colonna);
Dimension size = new Dimension(numeroRighe, numeroColonne);
for(int r = start.riga; r < start.riga + size.righe; r++) {
    for(int c = start.colonna; c < start.colonna + size.colonne; c++) {

    }
}
in cui start è (0,0) e size è la dimensione dell'intero "rettangolo".

A onor del vero, per quanto dice mmx[ngg], le condizioni sarebbero

r < Math.min(start.riga + size.righe, MR)
c < Math.min(start.colonna + size.colonne, MC)

con MR e MC numero di righe e colonne della matrice da leggere. Ma non stiamo qua a spaccar capelli in quattro - che non ce li abbiamo neanche.

Comunque se è così allora è chiaro che il procedimento di scansione della matrice di dimensioni MRxMC a blocchi di dimensione BRxBC altro non è che la ripetizione del ciclo suddetto - cioè della lettura di una singola sottomatrice - variando start.riga da 0 a MR a passi di BR unità e start.colonna da 0 a MC a passi di BC unità.

Se puoi evita un array di array (o un array list di array list) e usa un array singolo, lo "leggi" come una matrice con l'accesso tramite subscript (r,c) = r * w + c = i e puoi così usare arraycopy per "copiare" le righe dalla matriciona alla matricina.

Comunque fai prima la versione coi for.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2012, 00:01   #9
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
Codice:
MC = MaxCol - (MaxCol % N);
MR = MaxRig - (MaxRig % N);

MC = MaxCol;
MR = MaxRig;

for (C = 0; C < MC; C+=N)
  for (R = 0; R < MR; R+=N)
    for (Y = 0; Y < N && C + Y < MC; Y++)
      for (X = 0; X < N && R + X < MR; X++)
        NMatrice[Y, X] = BMatrice[C+Y, R+X]
NMatrice è quella più piccola che devi allocare di volta in volta
BMatrice è quella di origine
Se inizializzi MC e MR con il primo metodo ti tira fuori solo quelli che te definisci quadrati (matrici della stessa dimensione visto che scarta quelle più piccole)
Se inizializzi con il secondo metodo tiri fuori tutto e le matrici ai margini saranno più piccole delle altre
Se spieghi meglio è meglio perchè sono letteralmente andato a naso

P.S.

Ho letto ora l'altro post, parli di grafi, archi, tracciamento linee ecc. ecc. ma non è che ti serve una specie di BSP tree ?
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità

Ultima modifica di mmx[ngg] : 25-02-2012 alle 00:06.
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2012, 00:08   #10
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Ma non stiamo qua a spaccar capelli in quattro - che non ce li abbiamo neanche.
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2012, 10:52   #11
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da mmx[ngg] Guarda i messaggi
Codice:
MC = MaxCol - (MaxCol % N);
MR = MaxRig - (MaxRig % N);

MC = MaxCol;
MR = MaxRig;

for (C = 0; C < MC; C+=N)
  for (R = 0; R < MR; R+=N)
    for (Y = 0; Y < N && C + Y < MC; Y++)
      for (X = 0; X < N && R + X < MR; X++)
        NMatrice[Y, X] = BMatrice[C+Y, R+X]
NMatrice è quella più piccola che devi allocare di volta in volta
BMatrice è quella di origine
Se inizializzi MC e MR con il primo metodo ti tira fuori solo quelli che te definisci quadrati (matrici della stessa dimensione visto che scarta quelle più piccole)
Se inizializzi con il secondo metodo tiri fuori tutto e le matrici ai margini saranno più piccole delle altre
Se spieghi meglio è meglio perchè sono letteralmente andato a naso

P.S.

Ho letto ora l'altro post, parli di grafi, archi, tracciamento linee ecc. ecc. ma non è che ti serve una specie di BSP tree ?
Cos'è un BSP tree?
Ad ogni modo ho risolto, o almeno spero (devo fare qualche prova per esserne totalmente sicuro).
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2012, 11:15   #12
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
ftp://ftp.sgi.com/other/bspfaq/faq/bspfaq.html#6.txt

Per fartela spicciola è un algoritmo che potrebbe tornarti comodo per calcolare in tempi umani le entità circostanti (mari o terre che siano) o in alternativa potresti provare ad adattare una parte della struttura di un diagramma di Voronoi http://en.wikipedia.org/wiki/Voronoi_diagram
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2012, 12:19   #13
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Quote:
Originariamente inviato da mmx[ngg] Guarda i messaggi
ftp://ftp.sgi.com/other/bspfaq/faq/bspfaq.html#6.txt

Per fartela spicciola è un algoritmo che potrebbe tornarti comodo per calcolare in tempi umani le entità circostanti (mari o terre che siano) o in alternativa potresti provare ad adattare una parte della struttura di un diagramma di Voronoi http://en.wikipedia.org/wiki/Voronoi_diagram
Cioè?

Perché il mio problema successivo, ora che ho partizionato la matrice è questo:

Associo ad ogni partizione un indice crescente che parte da 1 e memorizzo tutte le coppie (indice,paritzione) in un hashmap.

Adesso però mi servirebbe, dato un indice calcolarmi tutti gli indici delle partizioni adiacenti, ovvero quelle che si trovano a Nord, Nord-est, Nord-ovest, Sud, Sud-est, Sud-overt,est, ovest.

A questo punto avrei solo l'hashmap, l'indice della partizione di cui voglio calcolarmi gli adiacenti ed il numero di righe e di colonne delle matrice delle partizioni.
Ovvero prendendo una matrice delle partizioni 3x3:

Codice:
1 2 3
4 5 6
7 8 9
Se mi viene dato l'indice 7 voglio che mi si ritorni: 4, 5, 6, 8.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2012, 12:28   #14
mmx[ngg]
Senior Member
 
Iscritto dal: Aug 2001
Città: Milano
Messaggi: 402
6 ?

Diciamo che ho capito perchè ho letto l'altro topic (è quello in diagonale) altrimenti ti prendevo per pazzo

Ti stai complicando la vita da morire, per quello che ti serve fare utilizzare un sottoinsieme di matrici è un pò folle. Leggiti come funziona Voronoi (guarda qua).

C'è tanto di codice in javascript che processa le informazioni anche step x step (non ho visto il codice quindi può far schifo come essere ottimo). Partendo dal presupposto che i puntini sono il punto centrale della tua entità, l'algoritmo processa tutti i punti di intersezione. E' quello che ti serve no ?
__________________
Phenom 2 555 X2@X4@3,6Ghz 1.33v Asus M4A785TD-V EVO 4GB Team Group Elite 1333Mhz AC Freezer Xtreme Corsair 450VX Samsung SyncMaster T220 Hd Seagate 500x2(Raid 0) Barton 2500+@3200+ vcore 1.550 (liquid cooled@+9° T.A.) Asus A7N8X-E Dlx 1Gb Ram Dual DDR Hd Maxtor SATA 160x2(Raid 0) GeXCube 9600XT Eizo 19P Le belle cose hanno un inizio e una fine...tutto il resto è la normalità

Ultima modifica di mmx[ngg] : 25-02-2012 alle 12:31.
mmx[ngg] è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Trapela in rete la roadmap dei nuovi gio...
In Germania la prima centrale solare gal...
Iliad lancia TOP 250 PLUS e TOP 300 PLUS...
UE: nuovi standard per i caricabatterie,...
Fine supporto Windows 10: breve guida pr...
Cyber Arena Tour: WINDTRE BUSINESS porta...
Addio Microsoft Word: la Cina sceglie WP...
Nano Banana si espande: l’AI di Google p...
Che fare con i Tesla Cybertruck invendut...
Simucube 3 Sport, Pro e Ultimate ufficia...
Facebook rilancia le offerte di lavoro: ...
Hisense PT1: il cinema in casa con la po...
Pixel 10: come risolvere (forse) i crash...
Plenitude lancia la sua Fibra ottica: fi...
Apple TV+ elimina il 'plus' dal nome: or...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:46.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v