2017-02-20 23 views
4

Если яПочему `sum` на матрице возврата Matrix, а не Vector?

mat = rand(8,8) 
sum(mat, 1) 

возвращаемый тип матрицы с одной строки, в то время как sum(mat, 2) дает матрицу с одним столбцом. Это меня удивляет, так как размеры одноэлементности обычно снижаются на 0,5, поэтому я ожидаю, что тип возврата обеих операций будет представлять собой Вектор. Почему одноэлементность не отбрасывается здесь?

Возможно, это было для того, чтобы сохранить ориентацию (например, sum(mat, 1) - это строка Vector), но поведение одинаково на 0.6, которое имеет явные 1-d RowVectors, поэтому это не похоже на объяснение ,

Спасибо!

ответ

4

Да, сокращения, такие как sum, сохраняют размерность массива. Это преднамеренно, поскольку оно позволяет передавать результат обратно через исходный массив. Это означает, что вы можете, например, нормализовать столбцы массива с ./:

julia> A = rand(1:100, 4, 3) 
4×3 Array{Int64,2}: 
94 50 32 
46 15 78 
34 29 41 
79 22 58 

julia> A ./ sum(A, 1) 
4×3 Array{Float64,2}: 
0.371542 0.431034 0.15311 
0.181818 0.12931 0.373206 
0.134387 0.25  0.196172 
0.312253 0.189655 0.277512 

В то время как двумерный случай мог бы быть обработаны RowVector с, что такой подход не обобщается на более высокие размеры.

Сказали, что есть другие случаи, когда размеры падения будут be similarly useful. Это open design question on the issue tracker.

+0

Ницца, спасибо! Я действительно думал о трансляции, но не в том, что она не будет обобщать более высокие измерения. Я вижу проблему, так что спасибо! Это связано с тем, что я определяю функции в строках и столбцах сумм матриц, и кажется естественным определять входные аргументы как 'Vector', но это означает, что я должен позвонить, например. 'myfunc (vec (sum (mat, 1)))', который выглядит неуклюжим. Но разрешение аргументов как матриц похоже на то, что это может вызвать проблемы. Впрочем, я могу решить эту проблему с отправкой. –

+1

Часто не нужно строго ограничивать типы аргументов. Вместо «Vector» вы почти наверняка можете использовать «AbstractVector», который будет включать в себя представления и измененные векторы и многие другие пользовательские типы векторов. И это распространено, чтобы быть даже шире, чем это для всех измерений и, возможно, даже для «Людей». Конечно, передача чего-то бессмысленного может быть ошибкой немного позже, чем вам может понравиться, но она позволяет кому-то передать вам что-то, что [выглядит как утка] (https://en.wikipedia.org/wiki/Duck_typing#In_Julia), и это все равно будет в порядке. –

+0

Спасибо, да, я на борту с тем, что обычно нет необходимости ограничивать типы аргументов функции (и важных внутри типов), и мне нравится принцип! Кроме того, я использовал AbstractVector (извините за несклонность). Однако в этом случае матрица строк и матрица столбцов имеют различное поведение от вектора (например, при передаче функции, такой как 'size'), так что это может привести к непредвиденным ошибкам, если я игнорирую размерность? В конце я сделал что-то вдоль 'f (x :: AbstractMatrix) = f (vec (x)); е (х :: AbstractVector) ... ' –

 Смежные вопросы

  • Нет связанных вопросов^_^