Несогласованные векторные операции в R?

Я преподаю математику и программирование (с R) в университете, и я большой поклонник хорошей и последовательной системы обозначений. Пожалуйста, взгляните на следующие простые векторные операции в R:

> v1 <- c(1,2,3)
> v2 <- c(4,5,6)
> v1 %*% v2
     [,1]
[1,]   32
> t(v1) %*% v2
     [,1]
[1,]   32
> v1 %*% t(v2)
     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    8   10   12
[3,]   12   15   18
> t(v1) %*% t(v2)
Error in t(v1) %*% t(v2) : non-conformable arguments
> v1 + v2
[1] 5 7 9
> v1 + t(v2)
     [,1] [,2] [,3]
[1,]    5    7    9
> t(v1) + t(v2)
     [,1] [,2] [,3]
[1,]    5    7    9

Я думаю, что здесь есть некоторые несоответствия: либо я что-то упускаю, либо R кажется довольно произвольным в отношении того, какие результаты вы получаете, когда вы транспонируете вектор или нет.

Какова основная логика здесь (которая, кстати, кажется совершенно отличной от Matlab).


person vonjd    schedule 04.04.2014    source источник
comment
Почему вы отметили это Matlab?   -  person Dan    schedule 04.04.2014
comment
Я согласен с тем, что правила Matlab более последовательны. R пытается сделать то, что удобно для интерактивного анализа (преобразование векторов в матрицы строк или столбцов, если это кажется уместным, удаление измерений). Его поведение является четко определенным, как указывает приведенный ниже ответ @GavinKelly, но это не значит, что иногда это не сбивает с толку.   -  person Ben Bolker    schedule 04.04.2014


Ответы (1)


?%*% дает логику:

Перемножает две матрицы, если они созвучны. Если один аргумент является вектором, он будет преобразован либо в матрицу строк, либо в столбцы, чтобы сделать два аргумента совместимыми. Если оба являются векторами, он вернет внутренний продукт (в виде матрицы).

Если они оба являются векторами (первый пример), вы получите внутренний продукт. Если вы поместите туда t( ), вектор будет приведен как матрица-столбец, а вектор фактически является матрицей-строкой, поэтому применяются нормируемые согласованные правила.

Точно так же на странице справки для «+» говорится, что аргументы будут преобразованы в векторы, и даются некоторые рекомендации по «форме» результата.

person Gavin Kelly    schedule 04.04.2014