Тензоры факела меняют размеры местами

Я наткнулся на эти две строки (вдогонку) кода в проекте факела:

 im4[{1,{},{}}] = im3[{3,{},{}}]
 im4[{3,{},{}}] = im3[{1,{},{}}]

Что делают эти две строки? Я предположил, что они сделали какой-то обмен.


person lars    schedule 29.06.2015    source источник
comment
Есть ли у факела константные табличные литералы? {} == {} возвращает true в факеле? Потому что без этого это ничем не отличается от использования = nil в правой части обеих этих строк.   -  person Etan Reisner    schedule 30.06.2015


Ответы (1)


Это описано в индексации в Документация по Torch Tensor

Индексация с использованием пустой таблицы {} является сокращением для всех индексов в этом измерении. Ниже приведена демонстрация, в которой используется {} для копирования всей строки из одной матрицы в другую:

> a = torch.Tensor(3, 3):fill(0)
     0 0 0
     0 0 0
     0 0 0

> b = torch.Tensor(3, 3)
> for i=1,3 do for j=1,3 do b[i][j] = (i - 1) * 3 + j end end
> b
     1 2 3
     4 5 6
     7 8 9

> a[{1, {}}] = b[{3, {}}]
> a
    7 8 9
    0 0 0
    0 0 0

Это присвоение эквивалентно: a[1] = b[3].

Ваш пример похож:

 im4[{1,{},{}}] = im3[{3,{},{}}]
 im4[{3,{},{}}] = im3[{1,{},{}}]

что более четко сформулировано как:

 im4[1] = im3[3]
 im4[3] = im3[1]

Первая строка присваивает значения из третьей строки im3 (двумерная подматрица) первой строке im4, а вторая строка присваивает первую строку im3 третьей строке im4.

Обратите внимание, что это не своп, так как im3 никогда не записывается, а im4 никогда не читается.

person ryanpattison    schedule 30.06.2015