Arrayfire常用的那几招(引用于葵花宝典)

/*************************
*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是输入矩阵


葵花宝典里面的东西太多了,列出了一些常用的关键字,后续慢慢补充吧,有不对的地方希望大家指正。







  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值