Arrayfire常用的那幾招(引用於葵花寶典)

2021-07-13 17:30:54 字數 4704 閱讀 1928

/*************************

*arrayfire在矩陣運算中常用的那幾招

*2016.6 ziv

*************************/

seq:線性序列,主要用來替換for迴圈

eg:seq b(10, 20, 2);   // [10, 20, 2]  => 10, 12, 14....20

其中10-begin,20-end,2-step;

array theta=seq(0,359);//轉換成矩陣模式

af_print(cos(theta*3.1415/180));//角度轉換

for(int i=0;i<360;i++)可以用seq(0,359)代替

順便提一句,arrayfire是按列進行儲存了,即360行1列

span:表示某一維度

eg:data(span,0)=data1(span,0);//用data1的第一列替換data的第一列

data(1,span)=data1(1,span);//用data1的第二行替換data的第二行

index:array中元素的索引

eg: array a = array(seq(1,9), 3, 3);//3行3列

af_print(a);//列印a

af_print(a(0));    // first element

af_print(a(0,1));  // first row, second column

af_print(a(end));   // last element

af_print(a(-1));    // also last element

af_print(a(end-1)); // second-to-last element

af_print(a(1,span));       // second row

af_print(a.row(end));      // last row

af_print(a.cols(1,end));   // all but first column

//元素賦值

a(span) = 4;        // fill entire array

a.row(0) = -1;      // first row

a(seq(3)) = 3.1415; // first three elements

//矩陣重新賦值,有點類似列舉

float h_inds = ; // zero-based indexing

array inds(1, 4, h_inds);

af_print(inds);

array b = randu(1, 4);

af_print(b);

array c = b(inds);        // get此處表示對b重新賦值b(0),b(4)等

//超出維度的去最後乙個值

af_print(c);

b(inds) = -1;             // set to scalar

b(inds) = constant(0, 4); // zero indices

af_print(b);

//取維度

int s=data.dims(0);//dimension of row

int s1=data.dims(1);//dimension of col

float:陣列轉換

eg:float b=;//定義乙個陣列

array c(2,2,b);//array(row,col,data);

另外array轉陣列暫時下面這種方法

array in = randu(5, 5);

af_print(in);//列印

for(int i=0;i<5;i++)

for(int j=0;j<5;j++)

constant&randu:常數矩陣和隨機矩陣生成

eg: array b = constant(1, 4, 4, s32);//4*4全0矩陣

b.row(0) = randu(1, 4, f32); // set a row to random values (also upcast)

//randu(row,col,type)

complex:複數矩陣,除了賦值其他操作和常規操作一樣。

eg:array data8=af::complex(datareal8,dataimag8);//8通道

array=complex(real,imag);

transpose:矩陣轉置

eg:array datat=transpose(data);//對data轉置

array datat=transpose(data,true);//對data共軛轉置,適用於複數矩陣

inverse:矩陣求逆

eg:af::array ia = inverse(a)

af::array i = af::matmul(a, ia);

multal:矩陣乘法

eg:array r1=matmul(datat,data);//array c =matmul(b,c);

det:矩陣行列式

templatet det(const array &in);

eg:double k=0.0;

k=det(data1);

dot:求向量內積

eg:array x = randu(10), y = randu(10);

af_print(dot(x,y));

diag:取矩陣對角及生成對角陣

eg:array a = randu(dim4(4, 3));

// a [4 3 1 1]

// 0.0000     0.5328     0.6793

// 0.1315     0.2190     0.9347

// 0.7556     0.0470     0.3835

// 0.4587     0.6789     0.5194

array b = diag(a);

// b [3 1 1 1]

// 0.0000

// 0.2190

// 0.3835

// creation

array a = randu(4);

// a [4 1 1 1]

// 0.0000

// 0.1315

// 0.7556

// 0.4587

array b = diag(a, 0, false);

// b [4 4 1 1]

// 0.0000     0.0000     0.0000     0.0000

// 0.0000     0.1315     0.0000     0.0000

// 0.0000     0.0000     0.7556     0.0000

// 0.0000     0.0000     0.0000     0.4587

array b = diag(a, -1, false);//下移一行

// c [5 5 1 1]

// 0.0000     0.0000     0.0000     0.0000     0.0000

// 0.0000     0.0000     0.0000     0.0000     0.0000

// 0.0000     0.1315     0.0000     0.0000     0.0000

// 0.0000     0.0000     0.7556     0.0000     0.0000

// 0.0000     0.0000     0.0000     0.4587     0.0000

cholesky:矩陣的cholesky分解a=l∗u,l=transpose(u)

eg: af::array out;

cholesky(out, in, is_upper);

cholesky(out_upper, in, true);//上三角

cholesky(out_lower, in, false);//下三角

lu:矩陣的lu分解,a=l∗u,分別為上三角和下三角矩陣

eg:array lin = in.copy();//in為輸入矩陣array

array pivot;//主元,用來加減行或列

luinplace(pivot, lin);

array lower, upper;

lu(lower, upper, pivot, in);

af_print(lower);

af_print(upper);

af_print(pivot);

qr:矩陣的qr分解,a=q∗r,q∗qt=i

eg:array in = randu(5, 8);

array qin = in.copy();

array tau;

qrinplace(tau, qin);

array q, r;

qr(q, r, tau, in);

svd:矩陣的svd分解a=u∗s∗vt

eg:     array u;

array s_vec;

array vt;

svd(u, s_vec, vt, in);//in是輸入矩陣

葵花寶典裡面的東西太多了,列出了一些常用的關鍵字,後續慢慢補充吧,有不對的地方希望大家指正。

C語言高效程式設計的幾招,你會幾招了?

第1招 以空間換時間 電腦程式中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程式的效率問題,我們就有了解決問題的第1招 以空間換時間。例如 字串的賦值。方法a,通常的辦法 define len 32 char string1 len memset string1,0,len st...

好笑的那幾個小時

幾個人為了給gigix暖房,特地以看球為名聚到他家 小家不大,收拾的很溫馨。myan習慣性地衝到gigix書櫃前,看了好一陣,發了一聲長嘆 這傢伙竟然把技術性的書籍全都放在最底層了,上面倒擺一些建築性的書籍。買的啤酒因為晚飯吃得太飽倒也沒有喝多少,這邊幾個看球,那邊幾個開始聊起技術來,竟也其樂融融,...

考研結束了的那幾天

準備了差不多乙個學期的考研終於結束了,雖然成績還不知道,但當我走出考場的那一刻起,我就覺得自己已經是盡力了,雖然第一天的英語幾乎讓我崩潰,但是我確實已經全力以赴了,如果結果不理想,那我也沒什麼好後悔了,只是可能會覺得,最後如果載在英語上,也實在是冤枉了點。道理雖然如此,而且考完之後對於英語,已有了思...