Если яПочему `sum` на матрице возврата Matrix, а не Vector?
mat = rand(8,8)
sum(mat, 1)
возвращаемый тип матрицы с одной строки, в то время как sum(mat, 2)
дает матрицу с одним столбцом. Это меня удивляет, так как размеры одноэлементности обычно снижаются на 0,5, поэтому я ожидаю, что тип возврата обеих операций будет представлять собой Вектор. Почему одноэлементность не отбрасывается здесь?
Возможно, это было для того, чтобы сохранить ориентацию (например, sum(mat, 1)
- это строка Vector), но поведение одинаково на 0.6, которое имеет явные 1-d RowVectors, поэтому это не похоже на объяснение ,
Спасибо!
Ницца, спасибо! Я действительно думал о трансляции, но не в том, что она не будет обобщать более высокие измерения. Я вижу проблему, так что спасибо! Это связано с тем, что я определяю функции в строках и столбцах сумм матриц, и кажется естественным определять входные аргументы как 'Vector', но это означает, что я должен позвонить, например. 'myfunc (vec (sum (mat, 1)))', который выглядит неуклюжим. Но разрешение аргументов как матриц похоже на то, что это может вызвать проблемы. Впрочем, я могу решить эту проблему с отправкой. –
Часто не нужно строго ограничивать типы аргументов. Вместо «Vector» вы почти наверняка можете использовать «AbstractVector», который будет включать в себя представления и измененные векторы и многие другие пользовательские типы векторов. И это распространено, чтобы быть даже шире, чем это для всех измерений и, возможно, даже для «Людей». Конечно, передача чего-то бессмысленного может быть ошибкой немного позже, чем вам может понравиться, но она позволяет кому-то передать вам что-то, что [выглядит как утка] (https://en.wikipedia.org/wiki/Duck_typing#In_Julia), и это все равно будет в порядке. –
Спасибо, да, я на борту с тем, что обычно нет необходимости ограничивать типы аргументов функции (и важных внутри типов), и мне нравится принцип! Кроме того, я использовал AbstractVector (извините за несклонность). Однако в этом случае матрица строк и матрица столбцов имеют различное поведение от вектора (например, при передаче функции, такой как 'size'), так что это может привести к непредвиденным ошибкам, если я игнорирую размерность? В конце я сделал что-то вдоль 'f (x :: AbstractMatrix) = f (vec (x)); е (х :: AbstractVector) ... ' –