質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.24%

  • R

    200questions

    R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Rで区分行列の積を計算したい。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 56

jackojacko_

score 11

Rで100列90万行の論理値からなる行列Aについて、クロス積(t(X) %*% X)を求めたいと思っています。
そのまま計算しようとしたところ、データが大きすぎてできなかったので、このページのように区分行列にブロック分けしてしたいと思っています。
しかしRでブロック行列を作るライブラリなどが見つからないので、どなたがご教授いただきたいです。
(Matrixライブラリでブロック対角行列は見つかったのですが、普通の区分行列を作る方法が知りたいです。)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

やりたいのはこういうことでしょうか?

a <- matrix(1:60, nrow=6)
rwidth <- 3
cwidth <- 5
for(rr in seq(1, nrow(a)/rwidth)*rwidth-rwidth+1){
  for(cc in seq(1, ncol(a)/cwidth)*cwidth-cwidth+1){
    print(paste("matrix for",rr,cc))
    pmatrix <- a[c(rr:(rr+rwidth-1)), c(cc:(cc+cwidth-1))] 
    print(pmatrix)
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/16 23:15

    for文回せばいいのですね!ありがとうございます
    行列積の計算がしたかったので、これをヒントに作ることができました。

    キャンセル

0

> a <- matrix(1:60, nrow=12)
> a
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1   13   25   37   49
 [2,]    2   14   26   38   50
 [3,]    3   15   27   39   51
 [4,]    4   16   28   40   52
 [5,]    5   17   29   41   53
 [6,]    6   18   30   42   54
 [7,]    7   19   31   43   55
 [8,]    8   20   32   44   56
 [9,]    9   21   33   45   57
[10,]   10   22   34   46   58
[11,]   11   23   35   47   59
[12,]   12   24   36   48   60


これの逆行列のクロス積を求めることにします。

> tcrossprod(a)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 [1,] 4565 4690 4815 4940 5065 5190 5315 5440 5565  5690  5815  5940
 [2,] 4690 4820 4950 5080 5210 5340 5470 5600 5730  5860  5990  6120
 [3,] 4815 4950 5085 5220 5355 5490 5625 5760 5895  6030  6165  6300
 [4,] 4940 5080 5220 5360 5500 5640 5780 5920 6060  6200  6340  6480
 [5,] 5065 5210 5355 5500 5645 5790 5935 6080 6225  6370  6515  6660
 [6,] 5190 5340 5490 5640 5790 5940 6090 6240 6390  6540  6690  6840
 [7,] 5315 5470 5625 5780 5935 6090 6245 6400 6555  6710  6865  7020
 [8,] 5440 5600 5760 5920 6080 6240 6400 6560 6720  6880  7040  7200
 [9,] 5565 5730 5895 6060 6225 6390 6555 6720 6885  7050  7215  7380
[10,] 5690 5860 6030 6200 6370 6540 6710 6880 7050  7220  7390  7560
[11,] 5815 5990 6165 6340 6515 6690 6865 7040 7215  7390  7565  7740
[12,] 5940 6120 6300 6480 6660 6840 7020 7200 7380  7560  7740  7920


行列を縦にk分割します。

> k <- 4 #分割する数
#分割
> blocks <- lapply(1:k,
                 function(x) {
                   nrow_b <- nrow(a)/k
                   start <- nrow_b*(x-1)+1
                   end <- nrow_b*x
                   return(a[start:end,])
                   }
                 )
> blocks
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1   13   25   37   49
[2,]    2   14   26   38   50
[3,]    3   15   27   39   51

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    4   16   28   40   52
[2,]    5   17   29   41   53
[3,]    6   18   30   42   54

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    7   19   31   43   55
[2,]    8   20   32   44   56
[3,]    9   21   33   45   57

[[4]]
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   22   34   46   58
[2,]   11   23   35   47   59
[3,]   12   24   36   48   60


この区分行列ごとに行列積を計算します。

> result_blocks <- lapply(1:k,
  function(row) {return(lapply(
  1:k,
  function(col) {
    return(
      tcrossprod(blocks[[row]],blocks[[col]])
    )
  }
))})


二重リストの中に行列が入っている状態ができるので、データフレームに戻します。

> result<- rbindlist(lapply(
  1:k,
  function(row_b) {
     return(data.frame(result_blocks[[row_b]][1:k]))}
  ))
> result
      X1   X2   X3 X1.1 X2.1 X3.1 X1.2 X2.2 X3.2 X1.3 X2.3 X3.3
 1: 4565 4690 4815 4940 5065 5190 5315 5440 5565 5690 5815 5940
 2: 4690 4820 4950 5080 5210 5340 5470 5600 5730 5860 5990 6120
 3: 4815 4950 5085 5220 5355 5490 5625 5760 5895 6030 6165 6300
 4: 4940 5080 5220 5360 5500 5640 5780 5920 6060 6200 6340 6480
 5: 5065 5210 5355 5500 5645 5790 5935 6080 6225 6370 6515 6660
 6: 5190 5340 5490 5640 5790 5940 6090 6240 6390 6540 6690 6840
 7: 5315 5470 5625 5780 5935 6090 6245 6400 6555 6710 6865 7020
 8: 5440 5600 5760 5920 6080 6240 6400 6560 6720 6880 7040 7200
 9: 5565 5730 5895 6060 6225 6390 6555 6720 6885 7050 7215 7380
10: 5690 5860 6030 6200 6370 6540 6710 6880 7050 7220 7390 7560
11: 5815 5990 6165 6340 6515 6690 6865 7040 7215 7390 7565 7740
12: 5940 6120 6300 6480 6660 6840 7020 7200 7380 7560 7740 7920


正しい計算ができました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.24%

関連した質問

同じタグがついた質問を見る

  • R

    200questions

    R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。