Как мне перевести этот "редкий" вызов Matlab bsxfun на R?
>> A = sparse([1,2,3,4,5])
A =
(1,1) 1
(1,2) 2
(1,3) 3
(1,4) 4
(1,5) 5
>> B = sparse([1;2;3;4;5])
B =
(1,1) 1
(2,1) 2
(3,1) 3
(4,1) 4
(5,1) 5
>> bsxfun(@times, A, B)
ans =
(1,1) 1
(2,1) 2
(3,1) 3
(4,1) 4
(5,1) 5
(1,2) 2
(2,2) 4
(3,2) 6
(4,2) 8
(5,2) 10
(1,3) 3
(2,3) 6
(3,3) 9
(4,3) 12
(5,3) 15
(1,4) 4
(2,4) 8
(3,4) 12
(4,4) 16
(5,4) 20
(1,5) 5
(2,5) 10
(3,5) 15
(4,5) 20
(5,5) 25
Который выглядит так в не разреженном виде:
>> full(ans)
ans =
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
>>
РЕДАКТИРОВАТЬ:
Я хотел бы сделать матричное умножение этих разреженных векторов и вернуть разреженный массив:
> class(NRowSums)
[1] "dsparseVector"
attr(,"package")
[1] "Matrix"
> class(NColSums)
[1] "dsparseVector"
attr(,"package")
[1] "Matrix"
>
NRowSums * NColSums (я думаю; или если это возвращает скаляр, а затем перевернуть их) без использования не разреженной переменной для временного хранения данных.
EDIT2:
В настоящее время у меня есть это:
NSums = tcrossprod(as(NRowSums, "sparseMatrix"), as(NColSums, "sparseMatrix"))
Это кажется немного неловким из-за того, что я пытаюсь сделать, особенно из-за кастинга. Это также крайне неэффективно, потому что он вычисляет все элементы, в которых существует NRowSum или NColSum, а не только пересечение этих двух. Таким образом, в этих NSums примерно на 100 раз больше записей, чем в исходной разреженной матрице.
3 ответа
Проверьте пакет "pracma" http://cran.r-project.org/web/packages/pracma/index.html Затем вы можете использовать bsxfun() так же, как в Matlab.
Если у вас действительно есть "редкая" ситуация, я думаю, что вы, вероятно, хотите начать с
df <- expand.grid(A=A, B=B)
df$val <- with(df, A*B))
# then pass that triple column set of i,j, and values to the sparse matrix constructors.
На данный момент ваш пример не подходит для тестирования, так как он плотный.
Вы можете транспонировать ваш массив B так, чтобы он был таким же, как и A:
B = t(B)
затем назовите внешнее произведение двух массивов:
outer(A,B)