/*************************
*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書櫃前,看了好一陣,發了一聲長嘆 這傢伙竟然把技術性的書籍全都放在最底層了,上面倒擺一些建築性的書籍。買的啤酒因為晚飯吃得太飽倒也沒有喝多少,這邊幾個看球,那邊幾個開始聊起技術來,竟也其樂融融,...
考研結束了的那幾天
準備了差不多乙個學期的考研終於結束了,雖然成績還不知道,但當我走出考場的那一刻起,我就覺得自己已經是盡力了,雖然第一天的英語幾乎讓我崩潰,但是我確實已經全力以赴了,如果結果不理想,那我也沒什麼好後悔了,只是可能會覺得,最後如果載在英語上,也實在是冤枉了點。道理雖然如此,而且考完之後對於英語,已有了思...