行列演算
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 20/64。
行列と数値の間、または同じサイズの2つの行列の間の算術演算は、セルごとに実行されます:
a <- matrix(1:4, nrow = 2, byrow = TRUE)
b <- matrix(c(10, 20, 30, 40), nrow = 2, byrow = TRUE)
print(a * 2)
print(a + b)出力:
[,1] [,2]
[1,] 2 4
[2,] 6 8
[,1] [,2]
[1,] 11 22
[2,] 33 44比較はセルごとにも機能し、論理行列を返します。これを使ってセルを数えたり、一致するセルだけを変更するためのインデックスとして使用したりできます。
m <- matrix(c(4, 12, 7, 15), nrow = 2, byrow = TRUE)
print(sum(m > 10))
m[m > 10] <- 10
print(m)出力:
[1] 2
[,1] [,2]
[1,] 4 10
[2,] 7 10t(m)は行と列を入れ替えます。%*%は行列積で、結果の各セルは1つ目の行列の行と2つ目の行列の列を組み合わせて計算されるため、ncol(a)はnrow(b)と等しくなければなりません。
a <- matrix(1:4, nrow = 2, byrow = TRUE)
print(t(a))
print(a %*% a)出力:
[,1] [,2]
[1,] 1 3
[2,] 2 4
[,1] [,2]
[1,] 7 10
[2,] 15 22サイズの異なる行列間でセルごとの算術演算を行うと、エラー non-conformable arrays で停止するため、まず dim() を比較します。行列積には独自のサイズ規則があります。
a <- matrix(1:4, nrow = 2)
b <- matrix(1:6, nrow = 2)
print(identical(dim(a), dim(b)))
print(dim(a %*% b))出力:
[1] FALSE
[1] 2 3チャレンジ
簡単cap_values(m, limit)を完成させてください。2行を返します。1行目はlimitを超えるセルの数を含むOver: 、2行目はlimitを超えるすべての値をlimitに置き換えた後の行列の合計を含むTotal: です。
提供されたコードは、1行から行列を読み取ります。行は;で区切られ、各行の値は,で区切られます。そのため、1,2;3,4は、行1 2と3 4を持つ行列です。次の行にはlimitが含まれます。コードは、返された各行を出力します。
自分で試してみよう
cap_values <- function(m, limit) {
# ここにコードを書いてください
c("Over: 0", "Total: 0")
}
# 提供された入力/出力コード:そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
parse_matrix <- function(line) {
rows <- strsplit(line, ";")[[1]]
matrix(as.numeric(unlist(strsplit(rows, ","))), nrow = length(rows), byrow = TRUE)
}
cat(cap_values(parse_matrix(input[1]), as.numeric(input[2])), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ