2017-02-18 28 views
1

В R, я могу иметь кусочно-умножение между матрицей и (конформной) вектора, например:поэлементного умножения между матрицей и матрицей

X <- matrix(c(1, 2, 3, 4), nrow = 2) 
a <- c(0, 1) 
X * a 

Каждая строка матрицы затем умножается соответствующий векторный элемент. Я также может делать то же самое для массивов размерности больше, чем 2:

XX <- array(X, dim = c(2, 2, 2)) 
a <- c(0, 1) 
XX * a 

Опять каждая строка умножается на соответствующий элемент вектора. Могу ли я сделать что-то подобное для 3d-массива и матрицы 2d? Я просто хочу, чтобы каждая подматрица массива была умножена на элементы с матрицей.

+0

Вы можете срезать с помощью 'apply', но он вызывает' as.vector' по результатам каждого фрагмента, уничтожая размеры. Однако он выполняет все вычисления, поэтому вы можете сбросить измерения (очень осторожно!), Если хотите. Другим обходным решением является выбор каждого фрагмента в списке, чтобы он не упрощался. – alistaire

ответ

0

вы не можете умножить его 2d матрицы, но вы можете попробовать это XX*c(1,2,3,4)

+0

Итак, 'XX * c (X)' будет работать для этого примера –

0

можно достичь «piece'-мудрое умножение (или любую арифметическую операцию, на самом деле), сначала построив соответствующий массив из матрица меньшего размера, а затем выполнение элементарной операции. В вашем примере:

X <- 1:8 
XX <- array(X, dim = c(2, 2, 2)) 
a <- c(0, 1) 

# construct array for point-wise operation 
expandeda <- array(a, dim=dim(XX)) 

XX * expandeda 

В результате это показывает, что, как вы сказали, отдельные элементы a применяются рядам (т.е. в первом измерении массива):

, , 1 

    [,1] [,2] 
[1,] 0 0 
[2,] 2 4 

, , 2 

    [,1] [,2] 
[1,] 0 0 
[2,] 6 8 

Построение соответствующего массива с использованием array(a, dim=dim(XX)) не просто работает для матриц 3d и 2d, но для любое значение размерности массивов, до length(a) == dim(XX)[1].