遍历Julia中的多个变量(或整个矩阵)

时间:2018-09-25 09:13:29

标签: arrays matrix optimization multidimensional-array julia

我有一个5维数组,想要对每个字段进行计算,并根据结果用“ true”或“ false”填充每个字段。现在,我想知道是否有一种快速的方法而不使用5个“嵌套”循环。 谢谢您的帮助

编辑: 抱歉,这个问题不清楚。我需要使用5个不同的变量进行计算,并且已经检查了每种可能的组合。 我目前的做法是:

def bisect_left(l, e, start = 0):
    if not l:
        return start
    pos = int(len(l)/2)
    if l[pos] < e and (pos+1 >= len(l) or l[pos+1] > e):
        return start + pos + 1
    elif l[pos] >= e:
        return bisect_left(l[:pos], e, start)
    else:
        return bisect_left(l[pos:], e, start+pos)

其中A是我的数组。现在,我想知道是否有更有效的方法。 抱歉,希望现在可以更清楚地说明。

2 个答案:

答案 0 :(得分:1)

您可以使用CartesianIndices函数,例如:

julia> x = Array{Tuple}(undef, 2,2,2,2,2);

julia> for idx in CartesianIndices(x)
       x[idx] = Tuple(idx)
       end

julia> x
2×2×2×2×2 Array{Tuple,5}:
[:, :, 1, 1, 1] =
 (1, 1, 1, 1, 1)  (1, 2, 1, 1, 1)
 (2, 1, 1, 1, 1)  (2, 2, 1, 1, 1)

[:, :, 2, 1, 1] =
 (1, 1, 2, 1, 1)  (1, 2, 2, 1, 1)
 (2, 1, 2, 1, 1)  (2, 2, 2, 1, 1)

[:, :, 1, 2, 1] =
 (1, 1, 1, 2, 1)  (1, 2, 1, 2, 1)
 (2, 1, 1, 2, 1)  (2, 2, 1, 2, 1)

[:, :, 2, 2, 1] =
 (1, 1, 2, 2, 1)  (1, 2, 2, 2, 1)
 (2, 1, 2, 2, 1)  (2, 2, 2, 2, 1)

[:, :, 1, 1, 2] =
 (1, 1, 1, 1, 2)  (1, 2, 1, 1, 2)
 (2, 1, 1, 1, 2)  (2, 2, 1, 1, 2)

[:, :, 2, 1, 2] =
 (1, 1, 2, 1, 2)  (1, 2, 2, 1, 2)
 (2, 1, 2, 1, 2)  (2, 2, 2, 1, 2)

[:, :, 1, 2, 2] =
 (1, 1, 1, 2, 2)  (1, 2, 1, 2, 2)
 (2, 1, 1, 2, 2)  (2, 2, 1, 2, 2)

[:, :, 2, 2, 2] =
 (1, 1, 2, 2, 2)  (1, 2, 2, 2, 2)
 (2, 1, 2, 2, 2)  (2, 2, 2, 2, 2)

The code stores in an entry `x[a,b,c,d,e]` a tuple `(a,b,c,d,e)`.

答案 1 :(得分:0)

您可以执行与一维矩阵相同的操作。

julia> A = rand(4,4,4,4,4);^C

julia> for (i, v) in enumerate(A)
         if v > 0.5 
           A[i] = 0
         end
       end

此外,类似的东西

   julia>map!(x->x>.5, A, A)

如果原始Array是Bool以外的其他类型,我建议您使用其他矩阵来分配结果值以实现类型稳定性。