2017-01-30 9 views
2

Из R документации:стреловидности эквивалент в Джулии

sweep: Возвращает массив, полученный из входного массива, выдувая сводную статистики.

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

> rs = rowSums(attitude) 
> ratios = sweep(attitude, 1, rs, FUN="/") 
> head(ratios) 
    rating complaints privileges learning raises critical advance 
1 0.1191136 0.1412742 0.08310249 0.1080332 0.1689751 0.2548476 0.12465374 
2 0.1518072 0.1542169 0.12289157 0.1301205 0.1518072 0.1759036 0.11325301 
3 0.1454918 0.1434426 0.13934426 0.1413934 0.1557377 0.1762295 0.09836066 
4 0.1568123 0.1619537 0.11568123 0.1208226 0.1388175 0.2159383 0.08997429 
5 0.1680498 0.1618257 0.11618257 0.1369295 0.1473029 0.1721992 0.09751037 
6 0.1310976 0.1676829 0.14939024 0.1341463 0.1646341 0.1493902 0.10365854 
> rowSums(ratios) # check that ratios sum up to 1 
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

Моя попытка в Джулии:

x = rand(3, 4) 
x[1, 1] = 10 
x[2, 1] = 20 
x[3, 1] = 30 
rowsum = sum(x, 2) 
rowsum_mat = repmat(rowsum, 1, size(x, 2)) 
x = x ./ rowsum_mat 

Это работает, но неуклюжим. Есть ли более элегантный и эффективный способ сделать это?

+0

Удаление R тега. Оператор развертки не относится к R. –

ответ

8

Не нужно использовать repmat - все . от Julia -операторы делают "broadcasting" по умолчанию. Это означает, что он соответствует размерам двух аргументов, а затем расширяет любые измерения, длина которых 1 (размеры синглтона) соответствуют другому массиву. Поскольку сокращения сохраняют одну и ту же размерность исходного массива, их можно использовать непосредственно с любым точечным оператором.

В вашем случае, вы можете просто использовать:

x ./ sum(x, 2) 

с:

julia> x ./ rowsum_mat == x ./ rowsum 
true