У меня есть 5-мерный массив, который нужно выполнить для каждого поля, и в зависимости от результата заполните каждое поле значением «истина» или «ложь». Теперь мне интересно, есть ли быстрый способ сделать это без использования 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 - мой массив. Теперь мне интересно, есть ли более эффективный способ сделать это. Извините, я надеюсь, что теперь это стало более ясным.

1
Tschaix 25 Сен 2018 в 12:13

2 ответа

Лучший ответ

Вы можете использовать функцию 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
Bogumił Kamiński 25 Сен 2018 в 09:24

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

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
Jayakrishnan Nair 25 Сен 2018 в 09:28