8
votes

Comment effectuez-vous une affectation conditionnelle dans les tableaux de Julia?

En octave, je peux faire

julia> A = [1 2; 3 4]
2x2 Array{Int64,2}:
 1  2
 3  4

julia> A[A>1] -= 1
ERROR: `isless` has no method matching isless(::Int64, ::Array{Int64,2})
 in > at operators.jl:33


0 commentaires

3 Réponses :


17
votes

Votre problème n'est pas avec l'affectation, en soi, c'est que a> 1 ne fonctionne pas. Vous pouvez utiliser l'élément a.> 1 à la place: xxx

mise à jour:

Notez que dans la Julia moderne (> = 0,7), nous Besoin d'utiliser . Pour dire que nous voulons diffuser l'action (ici, soustrayez par le scalaire 1000) pour correspondre à la taille de la cible filtrée à gauche. (Au moment où cette question a été posée à l'origine, nous avions besoin du point dans a.> 1 mais pas dans .- = .


0 commentaires

3
votes

Pour que cela fonctionne dans Julia 1.0, il faut changer = sur . = . En d'autres termes: xxx

sinon vous obtiendrez quelque chose comme

ERREUR: MODYError: Pas de méthode correspondant SetIndex_Shape_Check (:: INT64, :: INT64)


0 commentaires

5
votes

dans julia v1.0 Vous pouvez utiliser le remplacer! fonction à la place de l'indexation logique, avec des écarts considérables: xxx

pour des matrices plus grandes, la différence plane autour de 10x Scarpup.

La raison de l'accélération est que la solution d'indexation logique repose sur la création d'une matrice intermédiaire, tandis que remplacer!

légèrement Une manière ersière de l'écriture est xxx

Il ne semble pas y avoir de vitesse en utilisant min , cependant.

et Voici une autre solution qui est presque aussi rapide: xxx

et qui évite également les allocations.


0 commentaires