2017-03-17 2 views
2

Je suis en train d'effectuer logiques opertaions élément par élément sur tenseurs, mais il semble « et » mot-clé exécute logique ou, alors que « ou » mot-clé effectue logique et :flamme élément par élément Opération logique et/ou

a = torch.zeros(3) 
    a[1] = 1      -- a will be [1,0,0] 
    b = torch.ones(3) 
    b[3] = 0      -- b will be [1,1,0] 
    c = torch.eq(a,1) and torch.eq(b,1) 
    d = torch.eq(a,1) or torch.eq(b,1) 

Je me attendais c à devenir [1,0,0] car il serait logique d'avoir 1 que dans des positions où les deux un et b sont égaux à 1. aussi je me attendais d devenir [1,1,0] puisque ce sont les positions où soit un ou b sont égal à 1. À ma grande surprise, les résultats sont complètement le contraire! Des explications?

+0

Attention: selon la réponse, cette méthode est absolument incorrecte pour les opérations logiques élémentaires sur les Tenseurs. – kerrigan

Répondre

1

Selon Lua docs:

L'opérateur et renvoie son premier argument si elle est fausse; sinon, il retourne son deuxième argument. L'opérateur ou retourne son premier argument s'il n'est pas faux; sinon, elle renvoie son second argument

Dans ce cas, ce comportement se produit comme une « coïncidence ». Il retournera le deuxième argument (Tensor a) tout en appliquant l'opérateur and et le premier argument (Tensor b) tout en appliquant l'opérateur or. De plus, le tenseur a correspond à la logique élément par élément et tandis que le tenseur b correspond à la logique élémentaire ou.

+0

Vous avez raison! Je me suis juste dit que l'utilisation de torch.cmax (a, b) serait équivalente à "a ou b" et torch.cmin (a, b) à "a et b" (vous devez vous assurer que a et b sont des tenseurs logiques; ils contiennent seulement 1s et 0s) – kerrigan