首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Julia NFFT中,将向量和矩阵方法替换为单数组方法。

在Julia NFFT中,将向量和矩阵方法替换为单数组方法。
EN

Stack Overflow用户
提问于 2016-08-11 06:56:08
回答 1查看 93关注 0票数 2

在NFFT包中,有用于向量和矩阵的快速、专门的函数和用于一般数组的慢函数。我想使通用功能和专门功能过时,但我遇到了麻烦。

一个特殊函数族本质上是这样的(offset是在实际代码中计算的,但它的值对这个问题并不重要):

代码语言:javascript
复制
myfunc!(f::Vector, g::Vector)
    offset = 5
    n = length(g)
    N = length(f)

    for l = 1:N
        g[ ((l+offset)%n)+1 ] = f[l]
    end
end

代码语言:javascript
复制
myfunc!(f::Matrix, g::Matrix)
    offsetx = 5
    offsety = 5
    n1, n2 = size(g)
    N1, N2 = size(f)

    for ly = 1:N2
        for lx = 1:N1
            g[ ((lx+offsetx)%n1)+1, ((ly+offsety)%n2)+1 ] = f[lx, ly]
        end
    end
end

一般的函数可以这样写

代码语言:javascript
复制
myfunc!{D}(f::Array{D}, g::Array{D})
    offset = ntuple(d -> 5, D)
    n = size(g)

    for l in CartesianRange(size(f))
        idx = CartesianIndex{D}( ntuple(d -> ((l[d]+offset[d])%n[d])+1, D) )
        g[ idx ] = f[l]
    end
end

不幸的是,这是非常缓慢的。大部分时间花在循环中的ntuple中。

idx的其他可能性包括允许idx = Array{Int}(D)和使内部循环看起来像

代码语言:javascript
复制
for d = 1:D
    idx[d] = ((l[d]+offset[d])%n[d])+1
end
g[idx...] = f[l]

这也是缓慢的。

我认为,由于维度D是一个类型参数,所以可以为计算idx创建一个@generated函数,但我不知道如何做到这一点(或者是否有更好的方法)。

我用的是Julia v0.4.5。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-11 07:43:42

如何使用生成的函数执行此操作的答案是使用Base.Cartesian助手宏。

代码语言:javascript
复制
using Base.Cartesian 

@generated function myfunc!{T,D}(f::Array{T,D}, g::Array{T,D})
    quote
        @nexprs $D d->offset_d=5 #Declase offset_1=5, offset_2=5 etc

        @nloops $D l f begin
            (@nref $D g d->(l_d+offset_d)%size(g,d)+1) = @nref $D f l 
        end
    end
end

我已经确认这是正确的,至少对2D而言。我把它留给读者来描述。它或多或少不分配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38889303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档