Visualizzazione dei risultati da 1 a 3 su 3

Discussione: operazioni su matrici

  1. #1

    operazioni su matrici...urgente

    ciao,
    mi trovo in difficolta per rendere in codice java la seguente procedura;
    I dati sono rappresentati da una matrice, che può avere dimensioni diverse(quindi dovrei fare un codice restando sul generale), a numeri interi che ho in formato txt e da altri due file che rappresentano le marginali di riga e di colonna preliminari, con cui dovrò effettuare un confronto durante l'algoritmo.
    Devo leggere in java tale matrice V ed una volta letta devo effettuare la seguente operazione:
    presa la PRIMA riga i, sostituisco al valore di ogni cella vij , tale valore vij moltiplicato per il rapporto tra marginale di riga preliminare e totale di riga, approssimando il risultato all'intero inferiore; l'informazione della parte decimale mi servirà dopo. Effettuata questa operazione per tutte le celle della prima riga, devo calcolare la somma di questa nuova riga e controllare se il totale è pari o inferiore al valore preliminare della riga; se il valore somma è minore di quello preliminare, con differenza pari a un certo numero r, devo ordinare le celle riga in maniera decrescente rispetto alla loro parte decimale, col metodo bubble sort, e assegnare 1 intero alle prime r celle dell'ordinamento. il risultato sarà che la somma della riga in questione sarà pari al valore preliminare.
    Successivamente devo effettuare tale operazione per ogni riga; finito con le righe devo inziare tale operazione per ogni colonna; una volta terminata tale operazione con ogni colonna devo reiterare la procedura per le righe finchè i totali di riga corrispondono ai totali calcolati preliminarmente.
    Ciò che mi trovo davanti in questo momento è una matrice in cui i totali di riga coincidono con i valori preliminari mentre i totali di colonna non è detto che coincidano.
    può aiutarmi qualcuno?
    se servono chiarimenti e dati fatemi sapere vi invierò il tutto.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Premesso che in un forum tutte le discussioni hanno la stessa urgenza, non è chiaro cosa tu abbia realizzato finora e dove sia il problema di fondo...

    Posta un po' di codice e cerca di specificare qual è il problema che ne esce.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ciao,
    il codice che sono riuscito a scrivere è formato da tre files;
    il primao si chimaa elezioni:


    public class Elezioni {
    private final int COLONNE = 7;
    private final int RIGHE =26;
    private long[][] voti= new long[RIGHE][COLONNE];
    private int[][] seggi= new int[RIGHE][COLONNE];
    private double[][] seggidec= new double[RIGHE][COLONNE];


    public void InsertVoti(String[] testo)
    {
    String val="";
    int colonna=0,index=0;


    for(int i=0;i<testo.length && testo[i]!= "" && i<RIGHE;i++,index++)
    {
    colonna=0;
    for(int n=0;n<testo[i].length();n++)
    {
    if (testo[i].charAt(n)!=' ')
    {
    if(testo[i].charAt(n)!='.')
    val+=testo[i].charAt(n);
    }
    else
    {
    if (val!="")
    {
    if (colonna < COLONNE-1)
    voti[index][colonna++]=Long.parseLong(val);
    }
    val="";
    }

    }
    GetSeggi(index);
    }

    }

    private void GetSeggi(int index)
    {
    double somma=0;
    double val;
    double rapport;

    String[] valore= new String[100];
    FileIO fio = new FileIO();

    for(int i=0;i<COLONNE;i++)
    somma+=voti[index][i];


    fio.OpenFile("C:\\seggi_preliminari2008.txt");
    fio.ReadFile(valore);
    try
    {
    val=Double.parseDouble(valore[index+1]);
    rapport = val/somma;


    somma=0;

    for(int i=0;i<COLONNE;i++)
    {
    seggi[index][i]=(int)(voti[index][i]*rapport);
    seggidec[index][i]=voti[index][i]*rapport;
    somma+=seggi[index][i];
    }

    if(somma!=val)
    {
    if(somma>val)
    SetDifferent(index, somma-val);
    else
    SetDifferent(index, val-somma);
    }
    }
    catch(NumberFormatException e)
    {
    System.out.println(e.getMessage());
    }
    }

    public int GetSumRow(int index)
    {
    int somma=0;
    for(int i=0;i<COLONNE;i++)
    somma+=seggi[index][i];
    return somma;
    }

    public void WriteRows(String filepath)
    {
    String[] valori = new String[RIGHE];

    for(int index=0;index<RIGHE;index++)
    {
    valori[index]="";
    for(int i=0;i<COLONNE;i++)
    valori[index]+=Integer.toString(seggi[index][i]) + " ";
    }

    FileIO fio = new FileIO();
    fio.OpenFile(filepath);
    fio.WriteFile(valori);
    }

    private void SetDifferent(int index,double diff)
    {
    double[] seggi_dec = new double[COLONNE];
    int[] inds = new int[COLONNE];

    for(int i=0;i<COLONNE;i++)
    {
    seggi_dec[i]=seggidec[index][i];
    inds[i]=i;
    }

    bubblesort(seggi_dec,inds);

    for(int i=0;i<diff && i<COLONNE;i++)
    {
    seggi_dec[i]+=1;
    }

    for(int i=0;i<COLONNE;i++)
    seggidec[index][inds[i]]=seggi_dec[inds[i]];

    for(int i=0;i<COLONNE;i++)
    seggi[index][i]=(int)seggidec[index][i];
    }

    private void bubblesort(double[] seggi_dec, int[] inds)
    {
    int n = seggi_dec.length;
    for (int pass=1; pass < n; pass++) { // count how many times
    for (int i=0; i < n-pass; i++) {
    if (GetMajor(seggi_dec[i] , seggi_dec[i+1])==seggi_dec[i+1]) {
    swap(seggi_dec,i,i+1);
    swapIndex(inds,i,i+1);
    }
    }
    }
    }

    private double GetMajor(double val1, double val2)
    {
    int a=(int)val1;
    int b=(int)val2;

    if((val1-a)>(val2-b))
    return val1;
    else if((val1-a)<(val2-b))
    return val2;
    else
    return 0;
    }

    private void swap(double[] arr, int ind1,int ind2)
    {
    double tmp=arr[ind2];
    arr[ind2]=arr[ind1];
    arr[ind1]=tmp;
    }

    private void swapIndex(int[] inds,int ind1,int ind2)
    {
    int tmp=inds[ind2];
    inds[ind2]=inds[ind1];
    inds[ind1]=tmp;
    }





    }
    IL SECONDO si chima filiIO:

    import java.io.*;

    public class FileIO {
    private File f;

    FileIO()
    {

    }

    FileIO(String path)
    {
    f=new File(path);
    }
    public int OpenFile(String path)
    {
    f = new File(path);
    if (f.exists())
    return 0;
    return -1;

    }

    public int ReadFile(String[] testo)
    {
    BufferedReader br;
    int i=0;

    try
    {
    FileInputStream fis=new FileInputStream(f);
    InputStreamReader isr = new InputStreamReader(fis);
    br = new BufferedReader(isr);

    testo[i] = br.readLine();

    while(testo[i++]!=null)
    {
    testo[i]=br.readLine();
    }

    br.close();
    isr.close();
    fis.close();
    }
    catch(IOException e)
    {
    System.out.println(e.getMessage());
    return -1;
    }

    return 0;

    }

    public int WriteFile(String[] testo)
    {
    try
    {
    FileOutputStream fos = new FileOutputStream(f);
    PrintStream pr = new PrintStream(fos);

    for(int i=0;i<testo.length;i++)
    pr.println(testo[i]);

    pr.close();
    fos.close();
    }
    catch(IOException e)
    {
    System.out.println(e.getMessage());
    return -1;
    }

    return 0;
    }
    }
    il TERZO è il main:

    public class Main{

    public static void main(String[] argv)
    {
    try
    {
    Elezioni el = new Elezioni();
    final int MAX_FILE =100;
    String[] testo = new String[MAX_FILE];

    FileIO fio=new FileIO();
    fio.OpenFile("C:\\2008voti.txt");
    fio.ReadFile(testo);

    el.InsertVoti(testo);
    el.WriteRows("C:\\seggi.txt");

    }
    catch(ArrayIndexOutOfBoundsException e)
    {
    System.out.println(e.getMessage());
    }
    }

    }
    IL problema è che le operazioni devono essere fatte prima per tutte le righe della matrice , poi per tutte le colonne e poi devo riniziare con le righe finchè non verifico la condizione che le marginali di riga siano pari ai valori "preliminari".
    ecco i dati:
    matrice iniziale

    451.637 120.667 0 506.410 83.075 70.232 0
    484.253 222.273 0 379.139 52.369 71.103 0
    882.925 395.194 0 763.373 112.070 86.494 0
    849.485 754.956 0 663.696 103.091 131.122 0
    326.821 177.799 0 299.937 30.814 43.677 0
    128.992 58.062 0 150.972 20.460 25.687 147.666
    503.275 523.546 0 475.545 72.741 110.809 0
    335.365 307.048 0 336.961 59.133 60.317 0
    264.988 99.496 0 239.346 32.746 46.051 0
    367.369 68.379 0 375.807 49.247 37.830 0
    801.982 217.823 0 1.282.534 118.560 119.789 0
    749.123 48.305 0 1.110.402 82.919 98.573 0
    194.716 9.408 0 250.690 16.951 25.582 0
    342.498 21.566 0 405.050 43.999 59.848 0
    1.029.095 0 6.811 979.950 114.321 107.310 0
    477.825 0 3.889 296.978 28.809 58.558 0
    344.129 0 13.373 277.190 58.036 48.534 0
    71.994 0 10.567 35.330 54.629 11.459 0
    835.083 0 46.481 515.426 86.228 94.773 0
    803.941 0 33.563 458.825 71.835 122.511 0
    1.087.527 0 42.357 738.861 108.474 189.432 0
    125.322 0 2.650 131.434 20.142 23.430 0
    438.400 0 27.459 346.436 38.387 87.580 0
    607.468 0 73.858 341.960 51.525 151.047 0
    709.400 0 143.311 376.534 44.248 113.906 0
    415.252 0 6.168 354.212 38.866 54.665 0

    SEGGI PRELIMINARI SONO:
    PER RIGA
    14
    6
    22
    33
    29
    43
    13
    40
    15
    17
    40
    43
    15
    16
    3
    24
    22
    44
    18
    26
    28
    38
    10
    29
    20
    18
    PER COLONNA
    272
    60
    8
    211
    28
    36
    2
    UN altro provblema è poi che il codice fatto non è molto genrico, ad esempio dovendo implementare dati con matrici di diverse dimensioni devo cambiare ogni volta le dimensioni, invece vorrei sapere se è possibile fasre capire al compilatore, una volta letto il file, la dimensione della matrice
    Per ulteriori chiarimenti chiedi senza problemi,
    ti rigrazio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.