寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語によるベクトルと行列の積

C言語によるベクトルと行列の積です。
n×m の行列 A と、m×1 の列ベクトル b から、A と b の積を出力するプログラムです。

・問題
 n×m の行列 A と、m×1 の列ベクトル b を読み込み、A と b の積を出力するプログラムを作成してください。
 次のように m 個の数を縦に並べたものを m×1 の列ベクトルと呼びます。
f:id:neguse_atama:20200322013847p:plain
 次のように n 個の数を含む列ベクトルを m 個横に並べたものを n×m の行列と呼びます。
f:id:neguse_atama:20200322013906p:plain
 ベクトルまたは行列の中に含まれる数のことを要素と呼び、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 は次の式で得られます:
f:id:neguse_atama:20200322013924p:plain
・入力される値
 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