Итерация по нескольким переменным (или целой матрице) в Julia - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть 5-мерный массив, который я хочу сделать для каждого поля и в зависимости от результата заполнить каждое поле либо «true», либо «false».Теперь мне интересно, есть ли быстрый способ сделать это без использования 5 «вложенных» циклов.Спасибо за вашу помощь

Редактировать: Извините, что вопрос не ясен.Мне нужно сделать вычисления с 5 различными переменными, и я должен проверить каждую возможную комбинацию.Мой текущий подход таков:

while i<10
    while j<10
        while k < 10
            while l<10
                while m <10 
                    #some calculation which returns true or false
                    A[i,j,k,l,m]=f(i, j, k, l, m);
                m+=1;
                end
            l+=1;
            end
        k +=1;
        end
    j+=1; 
    end
i+=1; 
end

, где A - мой массив.Теперь мне интересно, есть ли более эффективный способ сделать это.Извините, я надеюсь, что сейчас все уточнено.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете выполнять те же операции, что и для одномерной матрицы.

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)

Также, если оригиналМассив имеет некоторый тип, отличный от Bool. Я бы предложил использовать другую матрицу для назначения значений результата для стабильности типов.

0 голосов
/ 25 сентября 2018

Вы можете использовать функцию 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)`.
...