/*************************
*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[] = {0, 4, 2, 1}; // 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[]={30,90,60,45};//定义一个数组
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++)
{
vecl.push_back(sum<float>(in(i,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:矩阵行列式
template<typename T> T det(const array &in);
eg:double k=0.0;
k=det<double>(DATA1);
dot:求向量内积
eg:array x = randu(10), y = randu(10);
af_print(dot<float>(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;
*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[] = {0, 4, 2, 1}; // 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[]={30,90,60,45};//定义一个数组
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++)
{
vecl.push_back(sum<float>(in(i,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:矩阵行列式
template<typename T> T det(const array &in);
eg:double k=0.0;
k=det<double>(DATA1);
dot:求向量内积
eg:array x = randu(10), y = randu(10);
af_print(dot<float>(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是输入矩阵
葵花宝典里面的东西太多了,列出了一些常用的关键字,后续慢慢补充吧,有不对的地方希望大家指正。