gsl資料型別之向量

2021-05-21 17:36:24 字數 2330 閱讀 4842

gsl中的向量與矩陣是基於一種底層的資料型別,即資料塊(block)實現的。因此我們的分析,就從資料塊開始。

與複數一樣,gsl中也有各種不同資料型別的資料塊,詳細列表如下:

gsl_block

double

gsl_block_float

float

gsl_block_long_double

long double

gsl_block_int

intgsl_block_uint

unsigned int

gsl_block_long

long

gsl_block_ulong

unsigned long

gsl_block_short

short

gsl_block_ushort

unsigned short

gsl_block_char

char

gsl_block_uchar

unsigned char

gsl_block_complex

complex double

gsl_block_complex_float

complex float

gsl_block_complex_long_double

complex long double

與上一節的分析一樣,我們將著眼於double型別對應的gsl_block型別展開分析。

讓我們來看看gsl_block的廬山真面目:

可見資料塊本質上仍然是乙個結構體。其中size_t在32位機上實際上就是unsigned int,在這裡gsl_block->size表示該資料塊中儲存的雙精度數的個數。而gsl_block->data則指向一塊size*sizeof(double)大小的連續記憶體,這塊記憶體就是資料塊的主體。

類似於c語言中動態記憶體管理,為了建立與銷毀這樣的資料塊,gsl提供了三個函式:

正如你所預料的,這裡的記憶體分配函式只是對c語言中malloc函式的簡單封裝,只不過其中包含了一些異常處理的判斷語句。

而gsl中向量與矩陣構建在資料塊的基礎上。因此與資料塊一樣,也有與前文列表中各種資料型別相對應的各種向量與矩陣。

值得注意的是,不同的向量可以指向相同的一塊資料塊。因此結構體裡需要乙個所有者識別符號。如果owner=1,則表示block歸該向量所有,當向量記憶體被釋放時,該block也將被釋放;而owner=0時,則表示所有者為其他向量block,因此在本向量被釋放時,該block不會被釋放。

由於考慮到block復用的問題,gsl一共提供了5個關於向量記憶體管理的函式:

其中gsl_vector_alloc、gsl_vector_calloc的功能與gsl_block_alloc、gsl_block_calloc的功能完全類似,呼叫這兩個函式在建立新的向量同時也將建立新的block。而gsl_vector_alloc_from_block與gsl_vector_alloc_from_vector則將從已經存在的block建立新的向量。

比較一下alloc與alloc_from_block的源**,便容易明白兩者的區別:

**中涉及到了一些巨集,對於gsl_vector,這些巨集的**如下:

注意,其中function(dir,name)巨集將產生字串dir_name。

從原始碼中我們容易看出呼叫gsl_vector_alloc_from_block與gsl_vector_alloc_from_vector並重用block中的資料時,允許設定新向量第乙個元素的起始位址、元素大小與元素個數。使用非常靈活。

gsl中包含一些操作向量元素的函式,經常用到的有以下幾個:

gsl中還提供了一種vector views的資料結構以便更靈活的描述向量。實際上這種神秘的view就是gsl_vector的乙個簡單封裝:

基於vector views,gsl實現了從向量中提取子向量的一系列函式,其中最簡單的版本是 

gsl_vector_viewgsl_vector_subvector(gsl_vector * v, size_t offset, size_t n)。

我們可以利用該函式從v向量中的第offset+1個元素開始提取n個元素構建乙個新的子向量。這一功能可以從它的原始碼中看出來:

其中巨集的定義如下:

可見由該函式建立的新向量只是對原始向量的一種引用,兩者共享一塊block。對新向量中資料的改變會同步的體現在原始向量中——這正是gsl中vector views資料結構的含義:它只是對原有資料的一種動態的重新描述。

除此之外,gsl還用一系列豐富的操作向量的函式,更詳細的資訊可以參見

OenCL 向量資料型別

1.首選向量寬度 函式clgetdeviceinfo需要乙個引數來表示所需的資訊型別,opencl提供了一系列的引數來引用向量寬度,名字形如 cl device prefered vector width type,函式的返回值是資料結構cl uint,表示乙個給定型別的向量其中有多少個相應型別的標...

JS資料型別之基礎資料型別

基本資料型別是按值訪問的,也就是說我們可以操作儲存在變數中的實際的值 基本資料型別的值是不可改變的,任何方法都無法改變乙個基本資料型別的值。let name qin ling ling name lisi console.log name 輸出 lisi上面的例子看來name的值好像變了,這裡的基礎...

基礎之資料型別

基本型別包括位元組型 char 整型 int 和浮點型 float double 定義基本型別變數時,可以使用符號屬性signed unsigned 對於char int 和長度屬性short long 對於int double 對變數的取值區間和精度進行說明。下面列舉了dev c 下基本型別所佔位...