Hatena::ブログ(Diary)

BOD

2011-03-01

[]行列をベクトルで割る 22:23

行列操作で困っている。

このような行列があったとして

> mat <- matrix(1:6, ncol=3, byrow=TRUE)
> mat
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

こういうベクトルで各行を除したい。

> v <- 1:3
> v
[1] 1 2 3

こうすると求めている結果とは違うし

> mat/v
     [,1]      [,2] [,3]
[1,]    1 0.6666667  1.5
[2,]    2 5.0000000  2.0

転置したら怒られる。

> mat/t(v)
 以下にエラー mat/t(v) :  適切な配列ではありません 

仕方ないのでベクトルを最初の行列の行数分繰り返した行列を作り

> vmat <- matrix(rep(v,nrow(mat)), ncol=ncol(mat), byrow=TRUE)
> vmat
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3

行列同士で除することで対応している。

> mat/vmat
     [,1] [,2] [,3]
[1,]    1  1.0    1
[2,]    4  2.5    2

しかしこれは回りくどい気もするので他のやり方がないものか。

kappanohe2011kappanohe2011 2011/03/03 21:00 定石ですが,t(t(mat)/v)

isseing333isseing333 2011/03/04 12:47 やっぱこれが定石なのか〜
でも転置するとデータの型が壊れることがあるんですよね。。

kappanohe2011kappanohe2011 2011/03/04 13:29 > でも転置するとデータの型が壊れることがあるんですよね

ありませんよ。matrix なのだから,データの型は転置しても変わらない。
data.frame なら 各列のもっとも水準の低いものになるけど。
あなたは今,数値演算をしようとしているのだから該当しない。

dichikadichika 2011/03/04 14:40 おお、みなさんありがとうございます!

sumer_camussumer_camus 2011/03/05 23:23 私もそれでやってました。
間違っていなかったと分かって安心しました。ありがとうございます。
行列の除算は、m→mmとか、個→パックとか、
単位の変換として日常的につかってます。

dichikadichika 2011/03/06 21:08 とりあえずはしのげるけどこのやり方でいいのかなってことは多々ありますよね。