о преобразовании массива в ArrayFire - PullRequest
1 голос
/ 10 июля 2019

Теперь я использую ArrayFire и столкнулся с чем-то странным.Например:

A dim is 257 x 1 x 1 x 1
af::floor(A) dim is 1 x 1 x 1 x 257
2*A dim is 1 x 1 x 1 x 257
A-1 dim is 1 x 1 x 1 x 257
A-af::constant(1,A.dims()) is 257 x 1 x 1 x 257

, где A генерируется из:

for (size_t jloop = 0; jloop < T; ++jloop){ //T=1600
    gfor (af::seq ploop, K){ //K=257
        auto A = matrix(ploop,jloop,0,0);//matrix dim is K*T*1*1
....

Так что мне придется использовать af::moddims все время.Но это действительно странно.Кто-нибудь с подобной проблемой?

вся for и gfor часть выглядит следующим образом:

auto Z_add = af::constant (0,af::dim4(K, T, K, noiseDims[3])); // Z_add is Z
auto Z_grad = af::constant (0,af::dim4(K, T, K, noiseDims[3])); // Z_grad is partial(Z_pji)/partial(m_p_j)

for (size_t iloop = 0; iloop < K; ++iloop){
  for (size_t jloop = 0; jloop < T; ++jloop){
    absinput_after_blur(iloop,jloop,af::span,af::span) = absinput(iloop,jloop,af::span,af::span);

    gfor (af::seq ploop, K){
      auto m_p_j = af::moddims(m(ploop,jloop,0,0),K); // dim of K*1*1*1
      auto m_floor = af::floor(m_p_j); // dim of K*1*1*1

      auto sum_m_p_j=m_floor*(2*m_p_j-m_floor-1) + m_p_j; // dim of K*1*1*1
      auto sum_mpj_partial_to_mpj=2*m_p_j; // dim of K*1*1*1

      auto condition1 = (af::abs(ploop-iloop)<m_p_j);
      auto condition2 = ((ploop - iloop)==0);

      auto Z_add_pji = condition1.as(f32) * ((!condition2).as(f32) * (af::moddims(absinput(ploop,jloop,0,0),K)*(m_p_j-af::abs(iloop-ploop))/sum_m_p_j) + condition2.as(f32) * (af::moddims(absinput(ploop,jloop,0,0),K)*(m_p_j-sum_m_p_j)/sum_m_p_j));
      auto Z_grad_pji = condition1.as(f32) * ((!condition2).as(f32) * (af::moddims(absinput(ploop,jloop,0,0),K)*(sum_m_p_j - sum_mpj_partial_to_mpj*(m_p_j-abs(iloop-ploop)))/(sum_m_p_j*sum_m_p_j)) + condition2.as(f32) * (af::moddims(absinput(ploop,jloop,0,0),K)*((1-sum_mpj_partial_to_mpj)*sum_m_p_j-sum_mpj_partial_to_mpj*(m_p_j-sum_m_p_j))/(sum_m_p_j*sum_m_p_j)));


      Z_add(ploop,jloop,iloop,af::span) = Z_add_pji;
      Z_grad(ploop,jloop,iloop,af::span) = Z_grad_pji;
    } 

    absinput_after_blur(iloop,jloop,af::span)+=af::sum(Z_add(af::span,jloop,iloop),0);
  }
} 

Коды предназначены для размытия absinput в absinput_after_blur на основе m (степень размытия) каждой точки и сохраните несколько полезных матриц в Z_add и Z_grad.

...