freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

飛行器實(shí)時(shí)仿真算法研究本科畢業(yè)論文(編輯修改稿)

2025-07-24 16:33 本頁面
 

【文章內(nèi)容簡介】 比較合理,現(xiàn)在對Vector類編碼時(shí)非常簡單,很多方法已經(jīng)通過兩個(gè)基類實(shí)現(xiàn)過了。但是注意Vector類包含向量元素, 并且提供盡可能多的構(gòu)造函數(shù),以便使用能使不同的數(shù)據(jù)類型轉(zhuǎn)為Vector類型。接口大致如下://向量類template typename Tclass Vector : public AlmostVectorT{ private: //保存向量元素 valarrayT vectorData_。 slice slice_。 public: //重寫基類的虛函數(shù) virtual const sliceamp。 getSlice() const 。 virtual const valarrayTamp。 constVal() const。 //由STL valarray 構(gòu)造 Vector(const valarrayTamp。 val) 。 Vector(const valarrayTamp。 val, const sliceamp。 s)。 ................................ Vector(const T * p, size_t n) 。 //以下兩個(gè)構(gòu)造函數(shù)是為了 //Vector Vector //VectorView Vector //ConstVectorView Vector Vector(const GneVectorT amp。 vec) 。 Vector(const GneVectorT amp。 vec, const slice amp。 s)。 …}。 VectorView接口 template typename T class VectorView : public AlmostVectorT //可變視圖 { private: valarrayT* pVectorData_。 slice viewSlice_。 public: //重寫基類的虛函數(shù) virtual const sliceamp。 getSlice() const 。 virtual const valarrayTamp。 constVal() const。 //下面兩個(gè)構(gòu)造函數(shù)是為了 //Vector MatrixView //VectorView VectorView VectorView(AlmostVectorT amp。 vec) 。 .................... virtual valarrayTamp。 val() 。 ……. }。 補(bǔ)充說明上面接口中使用到的slice類型是C++標(biāo)準(zhǔn)庫中valarray類的組成部分,大致結(jié)構(gòu)如下:class slice{public: ...................protected: size_t _Start, _Len, _Stride。}。 可以看到slice類主要保存三個(gè)數(shù)據(jù),即1. 向量的第一個(gè)元素的下標(biāo),_Start2. 向量的長度,_Len3. 步長,即每個(gè)元素之間的間隔,_Stride這種類型可以完全使用到我們的視圖類中,這也是為什么選擇valarray模板作為內(nèi)置向量類型的原因之一。上面對接口的陳述中沒有提到Vector類型的輸入和輸出,這里作已簡要說明。由于輸出只需要對對象具有只讀權(quán)限即可,而輸入則要求對對象的讀寫權(quán)限。所以輸出可以放到GneVector底層基類中,作為所有派生類的共有函數(shù)。而輸入則需放到AlmostVector類中,作為Vector和VectorView類的共有函數(shù)。決定某個(gè)函數(shù)放在基類還是派生類需要很周全的考慮,基類和派生類可以比作一個(gè)杠桿,不能一頭很重,一頭很輕,代碼失衡會導(dǎo)致后期的編碼和維護(hù)非常困難。輸入輸出函數(shù)的聲明如下:friend std::ostreamamp。 operator ( std::ostream amp。os, const GneVectorT amp。avec)。friend std::istreamamp。 operator ( std::istream amp。is, AlmostVectorT amp。avec)。 最后介紹本類初始化時(shí)的一個(gè)特點(diǎn)。 初始化一個(gè)向量對象有很多種方法,最直接的方法是給每一個(gè)元素賦值,如下: for(size_t i=0。 iN。 ++i) { v[i] = /* whatever */ } 但是這樣很不方便,尤其是當(dāng)我們想給v賦一系列不同的值時(shí),在for循環(huán)中是比較麻煩的。當(dāng)然也可以用下面這種方式實(shí)現(xiàn): double var[5] = { , , , 1, }。 Vectordouble v(var, 5)。 但這種方法的不便之處是使用了局部變量。依我來看,最理想的方法是把初始化列表放到構(gòu)造函數(shù)中,如下:Vectordouble v({ , , , 1, }, 5)。 // Error – invalid不幸的是這不符合C++的語法規(guī)則,變通一下,使用如下方式: Vectordouble v((double[]) { , , , 1, }, 5)。 // Usually OK這種方法通常是不會錯的,但是也有可能有些編譯器會報(bào)錯,我也不知道這算不算標(biāo)準(zhǔn)C++語法,因?yàn)闆]有一本C++書(我讀過的)講到過這種初始化方式。 為了解決這個(gè)問題,我使用了操作符,把我的類對象當(dāng)做標(biāo)準(zhǔn)輸出。從而可以使用如下方式進(jìn)行初始化: Vectordouble v(5)。 v , , , 1, 。 //或者 v 1 。 輸入數(shù)據(jù)的個(gè)數(shù)必須和對象的大小一致,否則會觸發(fā)庫中的出錯處理函數(shù)。上面的方式的優(yōu)點(diǎn)是,初始化列表里的數(shù)據(jù)不限制為常量。通常來說,初始化列表必須是在編譯時(shí)可確定的,但用上面的方式,初始化列表里的元素可以使變量,甚至是一個(gè)函數(shù)的返回值,只要能轉(zhuǎn)換為Vector模板對應(yīng)的實(shí)例化類型就可以了。當(dāng)然v也可以在其他任何時(shí)候重新使用此方法賦值。 另外,由于使用標(biāo)準(zhǔn)庫的valarray模板,所以在所有這些類的實(shí)現(xiàn)中,甚至沒有主動使用C++標(biāo)準(zhǔn)內(nèi)存分配和刪除操作符new,delete,一個(gè)也沒有出現(xiàn)。 最后,GneVector類和AlomostVector類都含有純虛函數(shù),所以無法實(shí)例化,這正是我想要的,給用戶使用的類是Vector、VectorView和ConstVectorView三個(gè)類。GSL提供的矩陣類型使用起來非常麻煩,由于是對c語言中的數(shù)組進(jìn)行包裝,所以用戶時(shí)刻都要注意內(nèi)存的變化,花費(fèi)大量精力減少內(nèi)存泄露,并且每種數(shù)據(jù)類型都有不同的函數(shù)版本,且不支持用戶自定義類型,所以我決定使用GSL的算法,重寫構(gòu)架矩陣類,并且給出C++的接口,支持多種類型,包括未知的用戶自定義類型,盡量減少用戶對程序本身的維護(hù)工作量,使用戶能專注于算法本身。根據(jù)上一節(jié)中向量類的分析可知,valarray是個(gè)非常方便好用的標(biāo)準(zhǔn)模板,所以這里也使用它作為我們的向量結(jié)構(gòu)體。但是如何把它當(dāng)做二維數(shù)據(jù)來讀取是個(gè)問題。這里我寫了個(gè)很簡單的類mslice,類似于上節(jié)中的slice,但是適用于二維數(shù)據(jù)。class mslice { public: …………. private: size_t startRow_。 size_t startCol_。 size_t rows_。 size_t cols_。 }。mslice類保存4條信息:1. startRow_,起始行。2. startCol_,起始列。3. rows_,行數(shù)。4. cols_,列數(shù)。根據(jù)這四條信息就可以確定當(dāng)前的valarray變量是如何表示一個(gè)矩陣的。 由于矩陣和向量的需求分析有很多相似的地方,比如都要求有視圖類,所以可以使用向量類的構(gòu)架方法。構(gòu)架如下:圖32 繼承關(guān)系圖 還有5個(gè)類接口和上節(jié)中的Vector類相似,由于基類設(shè)計(jì)良好,這些派生類的實(shí)現(xiàn)非常簡單,在此不一一列出,詳見原代碼。一個(gè)好的隨機(jī)數(shù)生成算法必須能夠在理論上和統(tǒng)計(jì)上同時(shí)滿足所需特性。滿足理論上的隨機(jī)是很難的,但我們也可以接受那些具有長周期,低的序列相關(guān)性的算法。對隨機(jī)數(shù)算法的測試通常是使用數(shù)值仿真來做統(tǒng)計(jì)測試,用隨機(jī)數(shù)來估計(jì)一些能用概率論求解出精確值的量,然后和精確值做比較即可測量該算法的隨機(jī)性。GSL提供了大量的隨機(jī)數(shù)生成器,但是由于給出是C的接口,使用起來非常麻煩,用戶要負(fù)責(zé)大量的內(nèi)存開辟和銷毀工作。我要做的就是使用GSL提供的算法,給出隨機(jī)數(shù)生成器的C++統(tǒng)一接口,并且在運(yùn)行時(shí)可以改變隨機(jī)數(shù)算法和種子。每一個(gè)隨機(jī)數(shù)的實(shí)例都有自己的狀態(tài)量,即可以同時(shí)使用多個(gè)相同的隨機(jī)數(shù)算法實(shí)例,它們之間是相互獨(dú)立的,互不影響的,所以可以在多線程環(huán)境下運(yùn)行。需要注意的是,隨機(jī)數(shù)生成器并不是正弦或余弦等函數(shù),對隨機(jī)數(shù)生成器的連續(xù)調(diào)用會產(chǎn)生不同的值,這正是我們想要的特性。但為了達(dá)到這種效果,生成器必須對一些狀態(tài)量進(jìn)行跟蹤,某些情況下,這些狀態(tài)是個(gè)整數(shù)(比如上次生的隨機(jī)數(shù)),但在更多的情況中,這些狀態(tài)量會很復(fù)雜,有可能是一個(gè)數(shù)列,而且每種隨機(jī)數(shù)生成算法使用的狀態(tài)量的大小和個(gè)數(shù)都不一樣。但是用戶使用的時(shí)候,不必關(guān)心狀態(tài)到底是怎么變的,這是算法內(nèi)部要考慮的事。 類名為CRandom,首先分析GSL提供的隨機(jī)數(shù)算法里的共有屬性,所有的算法都有種子的設(shè)置,最大值,最小值,當(dāng)前的狀態(tài)量,算法名稱,當(dāng)然最重要的是有返回介于最大值和最小值之間隨機(jī)數(shù)的方法。至于使用哪種算法可以在構(gòu)造函數(shù)里使用枚舉變量進(jìn)行選擇,同時(shí)提供一個(gè)改變算法的成員函數(shù)已實(shí)現(xiàn)運(yùn)行時(shí)改變算法。所以類CRandom的接口大致如下 class CRandom { public: /*構(gòu)造函數(shù)提供默認(rèn)隨機(jī)數(shù)算法,也可以動態(tài)設(shè)置*/ CRandom(RNG_ORDER type = RNG_TAUS)。 virtual ~CRand
點(diǎn)擊復(fù)制文檔內(nèi)容
物理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1