0Pricing
R Academy · レッスン

行列の算術演算と操作

要素単位の演算や行列の乗算、加算、減算を実行します。

「行列の算術演算と操作」はCoddyKit上の無料R Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

要素単位の演算と行列演算

Rでは、+、-、*、/を使う要素単位の演算と、%*%を使う本来の行列演算を区別します。正しい線形代数の計算を行うには、この違いを理解することが重要です。

A <- matrix(c(1,2,3,4), nrow = 2)
B <- matrix(c(5,6,7,8), nrow = 2)
cat('A:
'); print(A)
cat('B:
'); print(B)

# Element-wise multiply
cat('A * B (element-wise):
'); print(A * B)
# Matrix multiply
cat('A %*% B (matrix mult):
'); print(A %*% B)

要素単位の加算と減算

同じ次元の2つの行列に対する+と-は、対応する要素どうしを加算または減算します。これらは完全に要素単位の演算です。

# Monthly revenue vs target (in thousands)
revenue <- matrix(c(120,135,110,98, 145,160,132,115),
                  nrow = 2, byrow = TRUE)
target  <- matrix(c(130,130,130,130, 150,150,150,150),
                  nrow = 2, byrow = TRUE)

deviation <- revenue - target
cat('Revenue vs Target deviation:
')
print(deviation)
cat('Above target?:
')
print(revenue >= target)

要素単位の除算と乗算

同様に、同じサイズの行列に対する*と/は、要素ごとに演算します。行列を要素単位でスケーリング、正規化、または結合する場合に便利です。

# Scale a matrix by another (element-wise)
prices <- matrix(c(10, 20, 15, 25), nrow = 2)
quantities <- matrix(c(5, 3, 8, 2), nrow = 2)

total_cost <- prices * quantities
cat('Total cost per item:
')
print(total_cost)

# Normalise to row maximum
max_prices <- matrix(rep(apply(prices, 1, max), 2), nrow = 2)
norm_prices <- prices / max_prices
cat('Normalised prices:
')
print(norm_prices)

行列に対するスカラー演算

標準の算術演算子を使うと、スカラー(単一の数値)による演算を行列のすべての要素に適用できます。スカラーは行列の次元に合うようにリサイクルされます。

m <- matrix(c(10, 20, 30, 40, 50, 60), nrow = 2, ncol = 3)
cat('Original:
'); print(m)

cat('m + 5:
');  print(m + 5)
cat('m * 2:
');  print(m * 2)
cat('m / 10:
'); print(m / 10)
cat('m ^ 2:
');  print(m ^ 2)

本来の行列乗算 %*%

A %*% Bは線形代数における行列乗算を実行します。これを行うには、Aの列数とBの行数が等しくなければなりません。結果の次元は、Aの行数 x Bの列数になります。

# 2x3 times 3x2 = 2x2
A <- matrix(c(1,2,3, 4,5,6), nrow = 2, byrow = TRUE)
B <- matrix(c(7,8, 9,10, 11,12), nrow = 3, byrow = TRUE)
cat('A (2x3):
'); print(A)
cat('B (3x2):
'); print(B)
cat('A %*% B (2x2):
'); print(A %*% B)

rowSums()とcolSums()

rowSums(m)は各行の合計を計算し、colSums(m)は各列の合計を計算します。行列に次元名がある場合、どちらも名前付きベクトルを返します。

sales <- matrix(
  c(120,135,110,98,  145,160,132,115,  88,95,102,78),
  nrow = 3, byrow = TRUE,
  dimnames = list(c('Q1','Q2','Q3'), c('Jan','Feb','Mar','Apr'))
)
cat('Sales matrix:
'); print(sales)
cat('Quarterly totals:', rowSums(sales), '
')
cat('Monthly totals: ', colSums(sales), '
')

rowMeans()とcolMeans()

rowMeans(m)とcolMeans(m)は、それぞれ各行と各列の平均を返します。この一般的な処理では、apply()でmean()を適用するよりも高速です。

exam_scores <- matrix(
  c(88,92,75,81, 79,85,90,73, 95,78,82,88),
  nrow = 3, byrow = TRUE,
  dimnames = list(c('Alice','Bob','Carol'), c('Math','Sci','Eng','Hist'))
)
cat('Student averages:
')
print(rowMeans(exam_scores))
cat('Subject averages:
')
print(colMeans(exam_scores))

行列に対する比較演算

行列に比較演算子(==、>、<=など)を適用すると、同じ次元の論理行列が返されます。この論理行列をマスクとして、サブセット化や個数のカウントに利用できます。

scores <- matrix(c(88,45,92,61,73,55,84,79), nrow = 2)
cat('Scores:
'); print(scores)

# Which elements pass?
passing_mask <- scores >= 60
cat('Passing mask:
'); print(passing_mask)
cat('Number passing:', sum(passing_mask), '
')
cat('Passing scores:', scores[passing_mask], '
')

カスタムな行・列の処理に使うapply()

apply(m, MARGIN, FUN)は、行(MARGIN=1)または列(MARGIN=2)に関数を適用します。rowSumsやcolMeansでは対応できない、独自の集計が必要な場合に使います。

m <- matrix(c(3,1,4,1,5,9,2,6,5,3,5,8), nrow = 3)
cat('Matrix:
'); print(m)

# Max of each row
cat('Row max:  ', apply(m, 1, max), '
')
# Range of each column
cat('Col range:
')
print(apply(m, 2, range))
# Custom: count values > 4 per row
cat('Values > 4 per row:', apply(m, 1, function(x) sum(x > 4)), '
')

行方向へのベクトルのブロードキャスト

行列にベクトルを加算または乗算すると、Rは行列の長さに合わせてベクトルをリサイクルします。リサイクルは列ごとに行われるため、行方向の演算を意図している場合は予期しない結果になることがあります。

m <- matrix(c(10,20,30, 40,50,60), nrow = 2)
cat('Matrix:
'); print(m)

# Add a 3-element vector: R recycles column-by-column
v <- c(1, 2, 3)
cat('m + c(1,2,3):
'); print(m + v)

# For row-wise scaling, use sweep()
row_weights <- c(0.5, 2.0)  # scale row 1 by 0.5, row 2 by 2
cat('Row-wise scaled:
'); print(sweep(m, 1, row_weights, '*'))

算術演算のまとめ

Rで行列を操作する主な関数:

  • +、-、*、/ — 要素単位の算術演算
  • %*% — 行列乗算(線形代数)
  • rowSums()、colSums() — 行・列の合計
  • rowMeans()、colMeans() — 行・列の平均
  • apply(m, 1, fn) / apply(m, 2, fn) — カスタムな行・列の集計
  • sweep() — ベクトルを使った行・列方向の演算
m <- matrix(c(4,9,16,25), nrow = 2)
cat('Original:
'); print(m)
cat('sqrt (element-wise):
'); print(sqrt(m))
cat('rowSums:', rowSums(m), '
')
cat('colMeans:', colMeans(m), '
')

クイックチェック

AとBがRの2x2行列の場合、A * Bは何を計算しますか?

まとめ:行列の算術演算

よくできました!このレッスンの重要なポイントは次のとおりです。

  • 行列に対する+、-、*、/は要素単位の演算です
  • %*%は本来の行列乗算です(行 × 列)
  • rowSums()、colSums()、rowMeans()、colMeans()は行または列について集計します
  • 比較演算子は、同じ形状の論理行列を返します
  • apply(m, 1, fn)は行方向に関数を適用し、apply(m, 2, fn)は列方向に適用します
  • ベクトル化した行・列のスケーリングにはsweep()を使います
# Final: compute grade curve (add 5 to all scores, cap at 100)
raw <- matrix(c(88,55,92,73,60,45,78,95), nrow = 2)
curved <- pmin(raw + 5, 100)  # pmin applies min element-wise
cat('Raw:
');    print(raw)
cat('Curved:
'); print(curved)

よくある質問

「行列の算術演算と操作」レッスンは無料ですか?

はい。「行列の算術演算と操作」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「行列の算術演算と操作」で何を学びますか?

要素単位の演算や行列の乗算、加算、減算を実行します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「行列の算術演算と操作」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. matrix()による行列の作成
  2. 行列のインデックス指定と部分抽出
  3. 行列の算術演算と操作
  4. 行列の転置と形状変更
← R Academyに戻る