матричный поток: направо, а не вниз? - PullRequest
1 голос
/ 24 января 2011

Я не уверен, как вы это называете, но «поток» матриц по умолчанию направлен вниз (как показано ниже)

matrix(1,7,5)*(1:7)
1    1    1    1    1
2    2    2    2    2
3    3    3    3    3
4    4    4    4    4
5    5    5    5    5
6    6    6    6    6
7    7    7    7    7

Что если вы намерены вместо этого умножить вектор вправовниз?Есть ли лучший способ написать команду ниже?Имеется ли переключатель для столбца вместо строки (то же самое для replicate(7,1:7) он предполагает нисходящий поток (вставьте векторы строки вниз вместо векторов столбцов вправо); транспонировать решение?)

t(t(matrix(1,7,5))*(1:5))
1    2    3    4    5
1    2    3    4    5
1    2    3    4    5
1    2    3    4    5
1    2    3    4    5
1    2    3    4    5
1    2    3    4    5

Ответы [ 3 ]

1 голос
/ 24 января 2011

Матрица - это просто вектор с атрибутом dim.Элементы матрицы хранятся в векторе в основном порядке столбцов, и изменить это невозможно.* - это поэлементный оператор, который при необходимости повторяет свои аргументы.Вы можете увидеть правило переработки при работе:Вместо транспонирования вы можете использовать функцию matrix для изменения размера матрицы по строкам.

> matrix(x*1:5,nrow(x),ncol(x),byrow=TRUE)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    5
[3,]    1    2    3    4    5
[4,]    1    2    3    4    5
[5,]    1    2    3    4    5
[6,]    1    2    3    4    5
[7,]    1    2    3    4    5

Я не уверен, что это самое эффективное решение , но этолучшее, что я могу придумать на данный момент, и это немного быстрее, чем использовать t дважды.

1 голос
/ 25 января 2011

Если вы действительно хотите много делать после определения матрицы, вы всегда можете сделать оператор самостоятельно:

'%mat%'<- function(x,y)t(t(x)*y)
matrix(1,7,5)%mat%1:5
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    1    2    3    4    5
[3,]    1    2    3    4    5
[4,]    1    2    3    4    5
[5,]    1    2    3    4    5
[6,]    1    2    3    4    5
[7,]    1    2    3    4    5

Но я думаю, что проще просто перенести дважды, как вы сказали в вопросе:

t(t(matrix(1,7,5))*1:5)

Или, конечно, выбрать транспонирование матрицы один раз в начале, сделать все, что нужно с ней, а затем транспонировать ее обратно.

Насколько я знаю, нет никакого способаизменить поведение по умолчанию *, и вы, вероятно, тоже не захотите,

0 голосов
/ 24 января 2011

Ты имеешь в виду это?

> matrix(rep(1:7,5), nrow=7, ncol=5)
    [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5
[6,]    6    6    6    6    6
[7,]    7    7    7    7    7

> matrix(rep(1:7,5), nrow=5, ncol=7, byrow=TRUE)
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    1    2    3    4    5    6    7
[3,]    1    2    3    4    5    6    7
[4,]    1    2    3    4    5    6    7
[5,]    1    2    3    4    5    6    7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...