C言語によるベクトルと行列の積です。
n×m の行列 A と、m×1 の列ベクトル b から、A と b の積を出力するプログラムです。
・問題
n×m の行列 A と、m×1 の列ベクトル b を読み込み、A と b の積を出力するプログラムを作成してください。
次のように m 個の数を縦に並べたものを m×1 の列ベクトルと呼びます。
次のように n 個の数を含む列ベクトルを m 個横に並べたものを n×m の行列と呼びます。
ベクトルまたは行列の中に含まれる数のことを要素と呼び、m×1 の列ベクトル b の上から i 番目の要素は bi(i=1,2,...,m)、n×m
の行列 A には n×m 個の要素が含まれ、i 行 j 列目の要素は aij(i=1,2,...,n,j=1,2,...,m) で示されます。
n×m の行列 A とm×1 の列ベクトル b の積は、n×1 の列ベクトル c となり、c の i 番目の要素 ci は次の式で得られます:
・入力される値
1行目に n と m が空白区切りで与えられます。
続く n 行に行列 A の要素 aij が空白区切りで与えられます。
続く m 行にベクトル b の要素 bi がそれぞれ1行に与えられます。
・期待する出力
出力は n 行からなります。
ベクトル c の要素 ci をそれぞれ1行に出力してください。
・条件
1≤n,m≤100
0≤bi,aij≤1000
僕が作成、提出したコードは、以下のとおりです。
/* ITP1_6_D : Matrix Vector Multiplication http://judge.u-aizu.ac.jp/ C言語によるベクトルと行列の積 https://neguse-atama.hatenablog.com */ #include<stdio.h> int main(void){ int a[101][101],b[101],c[101]; int i,j; int n,m; scanf("%d %d",&n,&m); for(i=0;i<n;i++) { for (j=0;j<m;j++){ scanf("%d", &a[i][j]); } } for(j=0;j<m;j++){ scanf("%d",&b[j]); } for (i=0;i<n;i++) { c[i]=0; for(j=0;j<m;j++){ c[i]=a[i][j]*b[j]+c[i]; } } for (i=0;i<n;i++){ printf("%d\n",c[i]); } return 0; }
設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ITP1_6_D : Matrix Vector Multiplication