Когда я объединяюсь в R, я создаю строку или столбец?

avatar
John
1 июля 2021 в 19:25
72
1
2

Я объединяю следующее:

ExampleConCat <- c(1, 1, 1, 0) и у меня есть матрица 20x4 (MatrixExample, как показано ниже).

Я могу выполнить умножение матриц в Rstudio, как показано ниже:

matrix.multipl <- MatrixExample %*% ExampleConCat 

Я получаю следующие результаты:

#              [,1]
# cycle_1  0.99019608
# cycle_2  0.96400149
# cycle_3  0.91064055
# cycle_4  0.83460040
# cycle_5  0.74478532
# cycle_6  0.64981877
# cycle_7  0.55637987
# cycle_8  0.46893791
# cycle_9  0.39005264
# cycle_10 0.32083829
# cycle_11 0.26141338
# cycle_12 0.21127026
# cycle_13 0.16955189
# cycle_14 0.13524509
# cycle_15 0.10730721
# cycle_16 0.08474320
# cycle_17 0.06664783
# cycle_18 0.05222437
# cycle_19 0.04078855
# cycle_20 0.03176356

Я так понимаю:

Чтобы умножить матрицу m×n на матрицу n×p, ns должны быть одинаковыми, а результатом является матрица m×p. https://www.mathsisfun.com/алгебра/matrix-multipliing.html

Итак, тот факт, что он вычисляет вообще, указывает мне, что конкатенация выше создает столбец, то есть: MatrixExample - это матрица 20X4, поэтому ExampleConCat должен быть вектором 4X1, чтобы эти два умножались друг на друга.

Или существуют разные правила умножения вектора на матрицу, и не могли бы вы объяснить мне их просто?

Я заметил это, когда пытался

matrix.multipl <- ExampleConCat %*% MatrixExample 

Я получаю следующее:

Error in ExampleConCat %*% MatrixExample : non-conformable arguments

Я был бы признателен за объяснение, которое отражает, что я новичок в R и еще более новичок в умножении матриц.

# MatrixExample:

#                State A   State B     State C     State D
# cycle_1  0.721453287 0.201845444 0.06689735 0.009803922
# cycle_2  0.520494846 0.262910628 0.18059602 0.035998510
# cycle_3  0.375512717 0.257831905 0.27729592 0.089359455
# cycle_4  0.270914884 0.225616773 0.33806874 0.165399604
# cycle_5  0.195452434 0.185784574 0.36354831 0.255214678
# cycle_6  0.141009801 0.147407084 0.36140189 0.350181229
# cycle_7  0.101731984 0.114117654 0.34053023 0.443620127
# cycle_8  0.073394875 0.086845747 0.30869729 0.531062087
# cycle_9  0.052950973 0.065278842 0.27182282 0.609947364
# cycle_10 0.038201654 0.048620213 0.23401643 0.679161707
# cycle_11 0.027560709 0.035963116 0.19788955 0.738586622
# cycle_12 0.019883764 0.026460490 0.16492601 0.788729740
# cycle_13 0.014345207 0.019389137 0.13581754 0.830448113
# cycle_14 0.010349397 0.014162175 0.11073351 0.864754914
# cycle_15 0.007466606 0.010318351 0.08952225 0.892692795
# cycle_16 0.005386808 0.007502899 0.07185350 0.915256795
# cycle_17 0.003886330 0.005447095 0.05731440 0.933352173
# cycle_18 0.002803806 0.003949642 0.04547092 0.947775632
# cycle_19 0.002022815 0.002860998 0.03590474 0.959211445
# cycle_20 0.001459366 0.002070768 0.02823342 0.968236444
Источник
GuedesBF
1 июля 2021 в 19:34
0

c() создает вектор. Это так просто. Приведение вектора к матрице создаст матрицу length(vector) X 1.

GuedesBF
1 июля 2021 в 19:36
0

Отвечает ли это на ваш вопрос? Что означает %*% в R

Ответы (1)

avatar
monte
1 июля 2021 в 19:41
2

Если вы посмотрите раздел справки help("%*%"), там кратко описано правило умножения матриц, используемое для векторов.

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

Выполнение MatrixExample %*% ExampleConCat, как вы правильно указали, соответствует этим правилам, ExampleConCat рассматривается как матрица 4 by 1. Но когда ExampleConCat %*% MatrixExample выполнено, размеры не совпадают, то есть ExampleConCat имеет 4*1 (или 1*4), тогда как MatrixExample имеет 20*4 в качестве измерения.

Вектор будет преобразован в матрицу строк или столбцов, в зависимости от того, что заставляет матрицу работать, в качестве примера см. ниже:

exm = c(1,1,1,0)

exm_matrix = matrix(rnorm(16), 
                    ncol=4)

exm_matrix%*%exm
#>            [,1]
#> [1,]  2.1098758
#> [2,] -1.4432619
#> [3,] -0.2540392
#> [4,] -0.4211889

exm%*%exm_matrix
#>          [,1]       [,2]       [,3]      [,4]
#> [1,] 1.161164 -0.3602107 -0.3883783 -1.580562

Создано 02 июля 2021 г. пакетом reprex (v0.3.0)

John
2 июля 2021 в 18:26
0

Спасибо, этот ответ идеален и все проясняет. Я удивлен, что R вносит это изменение. Это необычно, что он просто делает это, или если бы я знал R или свою матричную алгебру лучше, я бы ожидал этого? Кроме того, не могли бы вы просто изменить место, где вы написали «25 * 4 как размерность, на 20 * 4 как размерность». Просто опечатка, которая может сбить с толку будущих читателей.

monte
2 июля 2021 в 18:50
1

Спасибо за опечатку. Вектор также является матрицей, это может быть либо 1 вектор-столбец, либо 1 вектор-строка. Итак, я думаю, R просто пытается сделать наилучшее предположение, согласовывая то, что работает, и продвигая его либо к 1 вектору строки, либо к 1 вектору столбца соответственно.