2012-06-04 11 views
5

Ho una firma funzione come:convertitrice double [] [] per galleggiare

static public double[][] G2Sweep(int row1, int row2, double[][] mtx) 
{ 
    mtx = (float) mtx; 
} 

Ma bisogno per convertire la matrice double [] [] in valori float. Come si fa in quanto il codice non può convertirlo esplicitamente?

+0

Vuoi convertire l'intera matrice, mantenendo il dimensionamento? ' – Codeman

+0

sì tutti i valori a virgola mobile, ma preferirei non dover fare un ciclo for per sfogliarlo tutto – cdub

+1

Si prega di non anteporre i titoli con "C#" e così via. Ecco a cosa servono i tag. –

risposta

4

No, non è possibile convertire il doppio in virgola mobile, soprattutto per gli array. È necessario creare una copia con il tipo corretto.

+1

sì, quello che dovevamo fare era cambiare tutto da double a float (tutte le 554 istanze nel mio codice) per risparmiare sulla potenza di elaborazione – cdub

1

sì tutti i valori di galleggiare, ma preferirei non dover fare un ciclo for per lop attraverso di essa tutti

Beh, mi dispiace, ma non si può. La trasmissione di un array a un tipo come float (o int o String o MonkeyPoo o qualsiasi altra cosa) non ha senso. Se hai bisogno di guardare ogni valore in un array allora hai bisogno di un ciclo. Non c'è modo di aggirare questo fatto.

Lamdas e quant'altro tutto si riduce a un ciclo. Dovrai solo mordere il proiettile e A) Convertire in loop (o usare qualcosa come .Cast<float>), o usare il tipo corretto per cominciare.

+0

+1 per MonkeyPoo :) –

5
public static float[][] Convert(double[][] mtx) 
{ 
    var floatMtx = new float[mtx.Length][]; 
    for (int i = 0; i < mtx.Length; i++) 
    { 
     floatMtx[i] = new float[mtx[i].Length]; 
     for (int j = 0; j < mtx[i].Length; j++) 
      floatMtx[i][j] = (float)mtx[i][j]; 
    } 
    return floatMtx; 
} 

Oppure:

public static float[][] Convert(double[][] mtx) 
{ 
    return mtx.Select(i => i.Select(j => (float)j).ToArray()).ToArray(); 
} 
+4

Word to the wise; anche se il secondo esempio * sembra * più semplice; internamente farà lo stesso ciclo. È certamente più facile da leggere e mantenere però! –

-1

si può evitare di scrivere il ciclo a mano se si utilizza LINQ.

float[][] floats = mtx.Select(r=>r.Select(Convert.ToSingle).ToArray()).ToArray(); 

MODIFICA: riparato.

+3

"Il cast specificato non è valido." -1 per non aver provato il tuo codice. –

1

È vero che si è possibile convertire nella posizione e che è necessario scorrere i valori.

Tuttavia, è giusto dire che al giorno d'oggi la memoria è a buon mercato.

Al momento della creazione della variabile double [] []; perché non creare semplicemente un float [] [] allo stesso tempo, quindi la conversione viene eseguita una sola volta.

in questo modo nel resto del ciclo di vita, è sufficiente utilizzare l'array di scrittura per l'attività di scrittura.

Detto questo, puoi chiarire il motivo per cui hai bisogno di un distinto float e doppio array?

* Giusto ma non necessariamente accettabile; se si tratta di una webapp ospitata sul proprio box o immagine virtuale; allora va bene. Se questa è una app standalone che potrebbe dover funzionare su un netbook o su Silverlight da qualche parte, non è giusto o fine.

+0

* "Tuttavia, è giusto dire che oggigiorno la memoria è a buon mercato. *" - Il mio netbook dice ciao. Se questa matrice frastagliata sarà mai relativamente grande, la creazione di due è una soluzione terribile se esiste qualcosa che neghi la necessità di farlo. –

+0

Ho detto * giusto * non * completamente ok ovunque *. Speravo di più per spingere l'Op. che la creazione potrebbe essere un posto migliore per guardare la conversione; è discutibile finché non sappiamo di cosa si tratta! E scuse al tuo NetBook :) –

1

altro modo è possibile fare questo sta usando il metodo Array.ConvertAll:

Array.ConvertAll<double, float>(doubles, d => (float)d); 

fa lo stesso loop ed esplicita la conversione, ma sembra migliore.

+0

Questa dovrebbe essere la risposta accettata. –