Возможно, отсутствуют размеры. Эта часть почти полностью управляется wi sh, чтобы обернуть matmul
в гуфун c. matmul
обозначает умножение матриц, и, если бы он делал только это, он мог бы быть покрыт подписью (m,n),(n,p)->(m,p)
. Тем не менее, он имеет особые случаи, когда измерение отсутствует, что позволяет обрабатывать любой аргумент как один вектор, при этом функция, таким образом, становится умножением на вектор-матрицу, матрицу-вектор или вектор-вектор (но без трансляции ). Чтобы поддержать это, предлагается разрешить постфиксировать имя измерения со знаком вопроса, чтобы указать, что измерение не обязательно должно присутствовать.
При таком добавлении подпись для matmul
может быть выражена как (m?,n),(n,p?)->(m?,p?)
. Это указывает на то, что если, например, второй операнд имеет только одно измерение, для целей элементарной функции он будет обрабатываться так, как будто этот вход имеет форму ядра (n, 1)
, а выход имеет соответствующую форму ядра (m, 1)
. Однако у действительного выходного массива удален гибкий размер, т. Е. Он будет иметь форму (..., m)
. Аналогично, если оба аргумента имеют только одно измерение, входные данные будут представлены в виде элементарных функций (1, n)
и (n, 1)
, а выходные данные - (1, 1)
, в то время как реальный возвращенный массив будет иметь форму * 1025. *. Таким образом, подпись позволяет использовать одну элементарную функцию для четырех связанных, но разных подписей, (m,n),(n,p)->(m,p)
, (n),(n,p)->(p)
, (m,n),(n)->(m)
и (n),(n)->()
.