原創(chuàng)|其它|編輯:郝浩|2012-12-17 16:50:01.000|閱讀 403 次
概述:NMath采用的數(shù)據(jù)視圖設(shè)計(jì)模式,它在存儲(chǔ)效率和性能上都有一定的優(yōu)勢,如果與切片相結(jié)合,數(shù)據(jù)視圖模式還能夠提高非常豐富的矩陣和向量操作語義。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
NMath采用的數(shù)據(jù)視圖設(shè)計(jì)模式,將不同數(shù)據(jù)類型加以區(qū)分,對(duì)向量和矩陣作為不同的數(shù)學(xué)對(duì)象區(qū)別處理。例如,在內(nèi)存中,一個(gè)連續(xù)的數(shù)組可以被當(dāng)作一個(gè)向量元素對(duì)象,同樣的這個(gè)數(shù)組,在一行一行布局后,也可以作為一個(gè)矩陣元素對(duì)象。在任何給定的時(shí)間點(diǎn),許多不同的對(duì)象可能會(huì)共享一個(gè)給定的數(shù)據(jù)塊。數(shù)據(jù)視圖設(shè)計(jì)模式在存儲(chǔ)效率和性能上都有一定的優(yōu)勢,如果與切片相結(jié)合,數(shù)據(jù)視圖模式還能夠提高非常豐富的矩陣和向量操作語義。
這個(gè)類將NMath中的一般向量和矩陣封裝為<Type>Matrix 和<Type>Vector,其中<type>可以是Float,Double,F(xiàn)loatComplex或者DoubleComplex。例如,F(xiàn)loatComplexVector類就表示一個(gè)單精度復(fù)數(shù)向量。矩陣和向量類中的每個(gè)類都包含一個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊中引用的查看參數(shù)值。例如,一個(gè)向量類的實(shí)例包含的數(shù)據(jù)塊,該數(shù)據(jù)塊里面就包括了引用元素的數(shù)目及步幅,或元素之間的步增量。同樣,矩陣對(duì)象也包含了數(shù)據(jù)塊,數(shù)據(jù)塊中包括了行列的數(shù)量,連續(xù)的行元素之間的距離和連續(xù)的列元素之間的距離。
所提供的索引需要進(jìn)行必要的間接引用,例如,v[i]返回的是向量v數(shù)據(jù)視圖的第i個(gè)元素的,A[i,j]返回的是矩陣A的數(shù)據(jù)視圖中第i行的元素。
獲得一個(gè)特定的數(shù)據(jù)塊的不同視圖,最常見的方式是通過切片和范圍的索引對(duì)象。這些類提供了指定一個(gè)擁有固定間距的非負(fù)整數(shù)的子集的方法。這其實(shí)是MATLAB中的冒號(hào)運(yùn)算符。任何整數(shù)子集都可以成為矩陣和向量的索引對(duì)象。
范圍和切片的差別其實(shí)只在于指定的整數(shù)子集不同。就切片來說,需要被指定的有起點(diǎn)整數(shù),整數(shù)的數(shù)量和步幅。例如,創(chuàng)建一個(gè)切片指定的整數(shù){2,4,6,8,10},指定2開始,共有5個(gè)元素,和步幅為2。
定義范圍時(shí),則需要指定第一個(gè)和最后一個(gè)整數(shù)。因此,如何整數(shù)子集{2,4,6,8,10}是用來創(chuàng)建一個(gè)范圍對(duì)象的,那2即為起點(diǎn),停止點(diǎn)為10,和2的步幅。
下面是一個(gè)例子就是使用切片對(duì)象來創(chuàng)建一個(gè)新的向量數(shù)據(jù)視圖:
// Create a vector of length 10 containing the integers 1-10: DoubleVector v = new DoubleVector( 10, 1, 1 ); // Construct a new vector, u, that views the first three elements // of v Slice first3 = new Slice( 0, 3 ); DoubleVector u = v[first3];
請(qǐng)注意,DoubleVector索引以接受切片對(duì)象來重載,并返回一個(gè)新的索引數(shù)據(jù)視圖。
DoubleVector u的表現(xiàn)形式與一個(gè)擁有3個(gè)元素(1,2,3)的向量架構(gòu)一樣,如下:
u[0] == 1; // true u[1] == 2; // true u[2] == 3; // true u[3]; //Index out of bounds exception!
當(dāng)u中的值改變的時(shí)候,u和新構(gòu)建向量數(shù)據(jù)視圖的區(qū)別就會(huì)更明顯了。用以下代碼將v值改變。
u[2] = 99; v[2] == 99; // true!
根據(jù)以上原理,如果需要沿著矩陣的主對(duì)角線遞增元素,通過以下代碼:
DoubleMatrix A = new DoubleMatrix( 5, 8 ); A.Diagonal()++;
使用矩陣類中的Diagonal()就可以完成了。
再次之后,如果需要在不影響其他對(duì)象的情況下,再創(chuàng)建一個(gè)私有的數(shù)據(jù)視圖,調(diào)用DeepenThisCopy()就可以了,如下:
DoubleMatrix A = new DoubleMatrix( 8, 8 ); Range topLeft = new Range( 0, 3 ); // Construct a matrix that views the top left // corner of A. DoubleMatrix AtopLeft = A[ topLeft, topLeft ]; // Make a deep copy of this data AtopLeft.DeepenThisCopy();
這樣,數(shù)據(jù)視圖邊和切片想結(jié)合,實(shí)現(xiàn)了豐富的向量與矩陣的操作語義。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)