thlongstorage *thtensor_(newsizeof)(thtensor *self);
thlongstorage *thtensor_(newstrideof)(thtensor *self);
把thtensor的size/stride資料提取出來,賦值給乙個新的thlongstorage並返回
th_api void thtensor_(narrow)(thtensor *self, thtensor *src, int dimension, long firstindex, long size);
從src裡找到第dimension個維度,從這個維度的firstindex開始,連續取size個子tensor
self複製於src,通過修改self->storageoffset和self->size[dimension]來維持檢視的正確。
th_api void thtensor_(select)(thtensor *self, thtensor *src, int dimension, long sliceindex);
去src裡的第dimension維度裡的第sliceindex個子tensor, 結果在self上進行修改
self通過前移size、stride,修改ndimesion來維持檢視正確。
呼叫了thtensor_(narrow)
void thtensor_(resize)(thtensor *self, thlongstorage *size, thlongstorage *stride);
先做一些檢查,size不能為null,stride可以為null,也可以存在,
如果stride存在,size -> size 和 stride -> size 必須一樣,這個是由tensor的構造決定的,檢查完畢後,呼叫resizend
void thtensor_(resizend)(thtensor *self, int ndimension, long *size, long *stride);
重置乙個thtensor維度的函式,和newview不一樣,這個不是要求元素總量一致的情況下修改檢視,
而是直接把指定thtensor變成新的指定size/stride,視情況還會修改底層的thstorage
對ndimension迴圈,檢查現在self的stride和size是否能夠與目標的stride和size對應,
其實就是逐維檢查size[d]、stride[d]和 self->size[d]、self->stride[d]是否一致,如果完全一致就直接沿用不需要resize了
size的最後幾個維度可能會有負數,遇到這種負數一律跳出,並且修改ndimension為實際要變換的數量。
如果self現有的屬性和指定的dimension不符合,那就重分配size和stride陣列的長度,然後重賦值
如果計算發現底層thstorage儲存不夠,或者thstorage直接為null,就重分配或者new乙個thstorage
void thtensor_(indexselect)(thtensor *tensor, thtensor *src, int dim, thlongtensor *index);
把src裡的第dim維的index個子張量取出,在tensor中儲存
如,src是3x4x5x6,dim=1,index=[2, 0, 1],取出後的tensor維度是3x3x5x6
void thtensor_(indexcopy)(thtensor *tensor, int dim, thlongtensor *index, thtensor *src);
tensor裡的資料的第dim維,按index的順序,被src的dim維按自然數順序賦值
比如,src是3x4x5x6,dim=1,index=[2, 0, 3, 1],此時tensor的dim1index2被src的dim1index0賦值,dim1index0被dim1index1賦值,以此類推
這便要求index的長度與src -> size[dim]必須相等,
index裡的數字不重複也不報錯,但是實際執行並不會如意,當index=[0, 0, 0, 0]時,
並不是tensor的每乙個子張量都等於src[:, 0, :, :],而是迴圈中tensor第0個、0個、0個、0個子張量被賦予src的第1、2、3、4個子張量
最後實際上相當於把tensor的第0個子張量賦為src的第4個子張量
【務必注意】這個分配順序和indexselect是相反的
void thtensor_(gather)(thtensor *tensor, thtensor *src, int dim, thlongtensor *index);
void thtensor_(scatter)(thtensor *tensor, int dim, thlongtensor *index, thtensor *src);
這兩個也是剛好相反的,gather是用index的順序,從src中收集資料,賦值給按自然數迴圈的tensor
scatter是把tensor的index位置資料,用src以自然數迴圈的值填充,相當於把src「打散」了
這兩個名字也非常形象
th_api void thtensor_(validxcorr2dptr)(real *r_, real alpha,real *t_, long ir, long ic,real *k_, long kr, long kc, long sr, long sc);
二維卷積操作
t_: input || ir, ic: data rows, cols || kr, kc: kernel rows, cols || sr, sc: stride rows, cols || r_: output
#define thnn_resizeas_indices(i1, i2)
i1, i2兩個tensorindextensor(tensorlongtensor),對i1做resize成i2的維度
#define thnn_check_shape(i1, i2)
檢查i1, i2兩個的size是否相同
#define thnn_check_shape_indices(i1, i2)
和check_shape基本一樣,不同的是它先用thstorage存i2的size2資訊,用i1和i2的size2比較,比較完以後再釋放
非常奇怪,為什麼要這樣做,和上乙個巨集在應用中的差別在**?
#define thnn_check_nelement(i1, i2)
檢查i1, i2是否具有同等數量的元素
#define thnn_check_dim_size(t, dim, dim_size, size)
#define thnn_check_dim_size_indices(t, dim, dim_size, size)
要求t的維度等於dim,t的第dim_size個維度大小等於size
PyTorch的一些類及函式
以下是一些我在使用pytorch中遇到的一些類及函式,為了便於理解和使用,將官網中的說明摘錄一些下來。class conv1d convnd def init self,in channels,out channels,kernel size,stride 1,padding 0,dilation ...
phpmcs 裡的一些函式
message alert,goback 顯示js訊息對話方塊形式的提示資訊 無返回值,alert為提示資訊內容,goback引數是使用者確認後跳轉的url位址 此引數可選,預設為空即不進行跳轉,如果該引數的值為 goback 則使用者確認後瀏覽器自動跳轉到前乙個開啟的位址,如果該引數的值為 clo...
matlab裡 p檔案的一些說明
其實.p檔案是對應.m檔案的一種預解析版本。matlab裡最常見的是 語句或函式寫在乙個.m檔案裡。偶爾會遇到.p檔案。在此對.p檔案做一些簡單的說明。實際中,第一次執行.m檔案時,matlab需要將其解析一次 第一次執行後的已解析內容會放入記憶體作第二次執行時使用,即第二次執行時無需再解析 這無形...