Come si calcola la distribuzione chi-quadro non centrata?

di il
18 risposte

Come si calcola la distribuzione chi-quadro non centrata?

Salve, sto iniziando da poco a programmare in C++ e ho un problema che non riesco proprio a risolvere: qual è il comando in C++ per calcolare la distribuzione chi-quadro non centrale. Vorrei sapere in che libreria è, e soprattutto i comandi esatti per richiamarla. Se può interessare, io uso dev C++ su windows XP. Tutto nasce dal fatto che devo trasformare un programma già scritto in Matlab in C++. Ora, in Matlab questa funzione è predefinita, ed è ncx2cdf. Invece in C++ non si chiama così e, appunto, non so come si chiama e come richiamarla. Aiutatemi per favore!

18 Risposte

  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Non esiste una libreria standard con questa funzione, puoi provare con queste .
    Ho dato un' occhiata e ho trovato che contengono qualcosa sulla chi-square, di più non so dirti.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Grazie Barba59, hai ragione la funzione non_central_chi_squared.hpp si trova in boost. In un'altra domanda ho chiesto quali comandi bisogna scrivere per richiamare questa funzione, cioè #include ...qualcosa
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Ciao azzurrino
    Non so bene cosa risponderti, ho usato Boost tempo addietro e non ricordo di aver avuto problemi particolari, segno che sul sito (www.boost.or) dovrebbe essere spiegato tutto chiaramente.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Non so se hai visto la domanda completa a riguardo ai comandi per richiamarla. L'ho scritta lì per raggingere più persone possibili e non so se riportare i dettagli anche qui perchè per regolamento non si potrebbe scrivere due volte la stessa domanda: in realtà è una domanda generale, che vale per qualunque funzione importata da una libreria esterna, non solo la boost, forse mi sto perdendo in un bicchier d'acqua. In pratica vorrei sapere se per importare non_central_chi_squared devo scrivere:
    #include <non_central_chi_squared.hpp> oppure #include <non_central_chi_squared.cpp> oppure altre cose diverse. In pratica non so, in generale, come si importa una funzione di una libreria esterna.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Ma l'esempio sull'utilizzo del template non ti basta?
    http://www.boost.org/doc/libs/1_36_0/libs/math/doc/sf_and_dist/html/math_toolkit/dist/stat_tut/weg/nccs_eg/nccs_power_eg.html
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Per skynet. no, non mi basta. Ho già provato a prendere il codcie di questa funzione, all'inizio metto l'intestazione: #include <boost/math/distributions/non_central_chi_squared.hpp>
    ma quando avvio il compilatore mi dice: "boost/math/distributions/non_central_chi_squared.hpp
    No such file or directory" E questo messaggio mi è sempre spuntato in tutti i tentativi che faccio. Io credo si tratti semplicemente di un problema di scrivere i comandi giusti per includere la funzione. Evidentemente #include <boost/math/distributions/non_central_chi_squared.hpp> da solo non basta. Ed è per questo che io chiedo quali sono i comandi esatti da mettere. Ad esempio: devo mettere #include boost? Oppure using namespace boost? Insomma quali sono i comandi aggiuntivi da scrivere quando devi includere una funzione di una libreria esterna?
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Boost è una libreria fatta da file header. prima di tutto bisogna scaricarla, installarla, mettere i riferimenti nel compilatore e poi lo puoi usare con gli include vari. Su come installarla c'è una guida proprio sul sito.
    http://www.boost.org/doc/libs/1_49_0/doc/html/bbv2/installation.html
    Un forum non è fatto per farti da guida passo passo, per quello esistono le guide dei prodotti.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Per skynet: evidentemente c'è stato un fraintendimento. Io ho già scaricato la libreria boost, ho preso il file che mi interessava che era appunto non-central_chi_squared.hpp l'ho aperto e ho fatto copia incolla sul file dove sto scrivendo scrivendo il programma fatto da me. Prima di compilare ho messo #include <non-central_chi_squared.hpp> e ho avviato la comilazione. Ma mi dice "No such file or directory". Evidentemente scrivere quell'include non basta. La funzione, quindi c'è l'ho già, già presa da boost, e la mia domanda è proprio sugli include vari da mettere.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    ho preso il file che mi interessava che era appunto non-central_chi_squared.hpp l'ho aperto e ho fatto copia incolla sul file dove sto scrivendo scrivendo il programma fatto da me
    E' qui che hai sbagliato. il file va lasciato così com'è, non è ne da modificare ne da aprire.
    Il file stesso richiede altri file header per poter funzionare. hai incluso anche loro?
    
    #include <boost/math/distributions/fwd.hpp>
    #include <boost/math/special_functions/gamma.hpp> // for incomplete gamma. gamma_q
    #include <boost/math/special_functions/bessel.hpp> // for cyl_bessel_i
    #include <boost/math/special_functions/round.hpp> // for iround
    #include <boost/math/distributions/complement.hpp> // complements
    #include <boost/math/distributions/chi_squared.hpp> // central distribution
    #include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
    #include <boost/math/special_functions/fpclassify.hpp> // isnan.
    #include <boost/math/tools/roots.hpp> // for root finding.
    #include <boost/math/distributions/detail/generic_mode.hpp>
    #include <boost/math/distributions/detail/generic_quantile.hpp>
    
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    La prova che ho fatto io è:
    1. scaricare boost
    2. estrare il tutto su una cartella supponiamo C:\Boost
    3. andare nelle proprietà del compilatore e aggiungere una cartella da dove cercare i file di inclusione (su Visual studio sta su Vc++ include Directories). la cartella da me inclusa era: C:\Boost\boost_1_49_0
    4. prendere l'esempio dal sito e compilare.
    5. Risultato: nessun errore e tutto si compila e si esegue.
    Fatta la stessa prova con Dev-C++(anche se si consiglia di usare un IDE diverso e non sta robaccia). Apri le proprietà del progetto che hai creato e vai su Directories\include Direcotries. da qui aggiungi il percorso di prima.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Per skynet: ho provato a fare quello che hai detto, ma ho trovato degli intoppi. Innanzitutto il fatto che dovevo includere anche quelle altre funzioni, cioè fwd, round, ecc... me ne ero accorto anche prima che scrivessi il post proprio guardando dentro il file non_central_chi_squared.hpp, che conteneva, appunto anche quegli include. Questa, però, rimane l'unica nota positiva per quanto mi riguarda. Per il resto un disastro: il file di boost che ho scaricato è zippato e quindi va decompresso. Però primo problema: ci sonoun sacco di cartelle e se provo a estrarlo tutto ci sta una vita, anzi nel mio caso dopo avere atteso a lungo mi diceva "L'applicazione non risponde". Non mi sono arreso e ho pensato di estrarre solo quei file che mi interessavano. quindi, oltre a non-central, anche fwd, round, chi_square, ecc.. cioè quelli che anche tu hai citato. Quando ho fatto extract ho messo come cartella di destinazione Dev-Cpp (quella dove ho tutti i programmi che scrivo) ed ecco che dentro Dev-Cpp, mi spunta effettivamente una cartella boost_1_49_0, che contiene i file .hpp che mi interessavano. A questo punto non so se quello che dici tu di Proprietà del progetto- include directories serve ancora o no, francamente nelle proprietà del progetto non trovo nessuna include directories, ma il punto è che ancora una volta, anche senza aprire i file.hpp, e mettendo solo l'elenco di include che mi hai postato tu, continua a dirmi: "No such file or directory". La differenza tra il principiante come me e chi ha più esperienza è che il principiante trova sempre intoppi anche su cose apparentemente semplici. Per questo chiedo aiuto.
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Ok fai sta altra prova. Apri il tuo progetto. Vai su help->check for update. Selezioni il secondo server (non mi ricordo il nome adesso) . Dalla lista degli aggiornamenti scegli boost (credo che 1.36 sia la piu aggiornata qui). Installa l'aggiornamento. Adesso devc++ ha le librerie boost installate. Prendi l'essmpio del sito e compila. Dovrebbe andare
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Ho fatto quello che hai detto, sono andato su Help, il secondo server, ecc.. ed effettivamente ho installato boost (la cui versione più recente era 1.46. Però continua a dairmi "No such file or directory". Inoltre, dove è installata? Dov'è la cartella esattamente, all'interno di Dev C++? Io non la trovo. Inoltre, siccome il codice è breve te lo copio qui, così magari se noti qualche errore puoi dirmelo. Breve, ma purtroppo mi cisto bloccando.
    #include <iostream.h>
    #include <cmath>
    #include <stdlib.h>
    #include <boost.h>
    using namespace std;
    
    #include <boost/math/distributions/non_central_chi_squared.hpp>
    #include <boost/math/distributions/fwd.hpp>
    #include <boost/math/special_functions/gamma.hpp> 
    #include <boost/math/special_functions/bessel.hpp> 
    #include <boost/math/special_functions/round.hpp> 
    #include <boost/math/distributions/complement.hpp> 
    #include <boost/math/distributions/chi_squared.hpp> 
    #include <boost/math/distributions/detail/common_error_handling.hpp> 
    #include <boost/math/special_functions/fpclassify.hpp> 
    #include <boost/math/tools/roots.hpp> 
    #include <boost/math/distributions/detail/generic_mode.hpp>
    #include <boost/math/distributions/detail/generic_quantile.hpp>
    
    int main()
    {
       double chiquad, XX, VV, DDelta;
       cout << "Parametri della distribuzione chi-quadro non centrale: \n";
       cin >> XX >> VV >> DDelta;
       chiquad = non_central_chi_squared(XX, VV, DDelta);
      
      cout << "chisquare = " << chiquad << "\n";
      
      system ("pause");
      return 0; 
    }
  • Re: Come si calcola la distribuzione chi-quadro non centrata?

    Allora, skynet, ho fatto qualche modifica rispetto al listato che ho postato prima. Intanto ho messo nell'include tutto il percorso della cartella in cui mi trovo, cioè
    #include <C:/Dev-Cpp/boost_1_49_0/boost/math/distributions/non_central_chi_squared.hpp> e non soltanto #include <boost/math/distributions/non_central_chi_squared.hpp> e così per le altre funzioni e sembra andare bene, perchè finalmente non dice più "No such file or directory". Poi, rispetto a ciò che ho postato prima, ho tolto #include <boost.h> che non va messo. Tuttavia, pur avendo fatto un importante passo avanti, non compila ancora, mi dice: "non_central_chi_squared undeclared" riferendosi all'istruzione: chiquad = non_central_chi_squared(XX, VV, DDelta);
    che appare nel main. Ho provato a mettere boost:: prima del nome funzione, cioè:
    chiquad = boost::non_central_chi_squared(XX, VV, DDelta)
    ma mi dice che non_central_chi_squared non appartiene a boost!!! Mi è venuto un dubbio, allora: ma non è che semplicemnte la funzione non è stata compilata? Io ho solo il file .hpp, che tu mi hai detto di non toccare, nè aprire, ma il .cpp non c'è! La sensazione, comunque, è di essere vicino alla sluzione e se risolvo questo problema della funzione "undeclared" ho risolto tutto.
Devi accedere o registrarti per scrivere nel forum
18 risposte