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

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

ただいまの
回答率

90.33%

  • C

    4004questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Vim

    532questions

    VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

行列積のサイズを指定して実行したい

受付中

回答 1

投稿

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

yu_yu_yu

score 2

 前提・実現したいこと

行列積の計算を、指定したサイズで行うようにしたいです。
サイズの指定は、オプションで指定するようにしてあり、変数 size に格納されています。
コンパイルのエラーは無くなったのですが、実行しても何も表示されません。

 該当のソースコード

C

include <stdio.h>

include <stdlib.h>

include <time.h>

double gettime()
{
struct timespec ts;
int rv = clock_gettime(CLOCK_REALTIME, &ts);
if (rv != 0) {
printf("clock_gettime() failed\n");
exit(1);
}

return ts.tv_sec + ts.tv_nsec * 1.0e-9;
}

void dumpMat(const char *pName, double *pArray, int size)
{
printf("%s[%d][%d] = {\n", pName, size, size);
for (int i = 0; i < size; i++) {
printf("  {");
for (int j = 0; j < size; j++) {
printf("%s%7.4f", ((j == 0) ? " " : ", "), pArray[i*size+j]);
}
printf(" };\n");
}
printf("};\n\n");
}

int 
main(int argc, char *pArgv[])
{
int size = 0;

if (argc != 2) {
printf("Usage : matmul SIZE\n");
exit(1);
}

size = atoi(pArgv[1]);
if (size <= 0) {
printf("Invalid size.\n");
}

// allocate memory for matrix a/b/c
double a, b, c; double pA, pB, pC;
int i, j, k;
int n;
int term;
a = malloc(n*n*sizeof(double));
b = malloc(n*n*sizeof(double));
c = malloc(n*n*sizeof(double));

for(i = 0; i<n*n;i++){
a[i] = malloc(n*n*sizeof(double)); 
b[i] = malloc(n*n*sizeof(double)); 
c[i] = malloc(n*n*sizeof(double)); 
}
// Initialize matrix.
// Set random value to a/b by pseudo random generator drand48().
// Matrix c is cleared bt 0.
srand(1);
pA = malloc(n*sizeof(double *));
pB = malloc(n*sizeof(double *));
pC = malloc(n*sizeof(double *));

for(i = 0; i < n; i++){
pA[i] = *a + i*n;
pB[i] = *b + i*n;
pC[i] = *c + i*n;
for(j = 0; j < n; j++){
pA[i][j] = drand48();
pB[i][j] = drand48();
printf(".");
}
}

double ts = gettime();

// Write matrix multiply code, here.
// Calculate c = a * b
for(i=0;i<3;i++){
for(j=0;j<3;j++){
c[i][j] = a[i][j] * b[i][j];

for(i=0;i<n;i++){
for(j=0;j<n;j++){
term = 0;
for(k=0;k<n;k++)
term = term + a[i][k] * b[k][j];
c[i][j] = term;
}
}
}
}

double te = gettime();
printf("ELAPSED TIME : %f msec\n", (te - ts) * 1000);

if (size <= 6) {
// Output matrix.
dumpMat("a", *pA, size);
dumpMat("b", *pB, size);
dumpMat("c", *pC, size);
}

// Release memory of matrix a/b/c.
free(a);
free(b);
free(c);
free(pA);
free(pB);
free(pC);
return 0;
}

```

 補足情報(FW/ツールのバージョンなど)

CygwinとVimを使って書いています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

変数nを初期化せずに使ってるからでは。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/03 12:12

    ありがとうございます。変数nを初期化して実行したところ、
    Segmentation fault (コアダンプ)
    といったエラーメッセージが出てきてしまいました・・・

    キャンセル

  • 2018/07/03 13:07

    追加の指摘です。
    a,b,c,pA,pB,pCがポインタになっていない。
    pA,pB,pCのmallocサイズはn*nでなくて大丈夫でしょうか?
    他にもありそうですが、まずはこの2点直してみてどうなるか。

    キャンセル

  • 2018/07/03 13:31

    以下のように書き換えてみたのですが、やはり同じエラーが出てしまいます・・・


    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>



    double gettime()
    {
    struct timespec ts;
    int rv = clock_gettime(CLOCK_REALTIME, &ts);
    if (rv != 0) {
    printf("clock_gettime() failed\n");
    exit(1);
    }

    return ts.tv_sec + ts.tv_nsec * 1.0e-9;
    }



    void dumpMat(const char *pName, double *pArray, int size)
    {
    printf("%s[%d][%d] = {\n", pName, size, size);
    for (int i = 0; i < size; i++) {
    printf(" {");
    for (int j = 0; j < size; j++) {
    printf("%s%7.4f", ((j == 0) ? " " : ", "), pArray[i*size+j]);
    }
    printf(" };\n");
    }
    printf("};\n\n");
    }



    int
    main(int argc, char *pArgv[])
    {
    printf("a");
    int size = 0;

    if (argc != 2) {
    printf("Usage : matmul SIZE\n");
    exit(1);
    }

    size = atoi(pArgv[1]);
    if (size <= 0) {
    printf("Invalid size.\n");
    }

    // allocate memory for matrix a/b/c
    double **a, **b, **c;
    double *pA, *pB, *pC;
    int i, j, k;
    int n = 0;
    int term;
    a = malloc(n*n*sizeof(double *));
    b = malloc(n*n*sizeof(double *));
    c = malloc(n*n*sizeof(double *));

    for(i = 0; i<n*n;i++){
    a[i] = malloc(n*n*sizeof(double));
    b[i] = malloc(n*n*sizeof(double));
    c[i] = malloc(n*n*sizeof(double));
    }
    // Initialize matrix.
    // Set random value to a/b by pseudo random generator drand48().
    // Matrix c is cleared bt 0.
    srand(100);
    pA = malloc(n*n*sizeof(double));
    pB = malloc(n*n*sizeof(double));
    pC = malloc(n*n*sizeof(double));


    for(i = 0; i < n; i++){
    a[i] = pA + i*n;
    b[i] = pB + i*n;
    c[i] = pC + i*n;
    for(j = 0; j < n; j++){
    a[i][j] = drand48();
    b[i][j] = drand48();
    }
    }


    double ts = gettime();

    // Write matrix multiply code, here.
    // Calculate c = a * b
    for(i=0;i<3;i++){
    for(j=0;j<3;j++){
    c[i][j] = a[i][j] * b[i][j];

    for(i=0;i<n;i++){
    for(j=0;j<n;j++){
    term = 0;
    for(k=0;k<n;k++)
    term = term + a[i][k] * b[k][j];
    c[i][j] = term;
    }
    }
    }
    }


    double te = gettime();
    printf("ELAPSED TIME : %f msec\n", (te - ts) * 1000);

    if (size <= 6) {
    // Output matrix.
    dumpMat("a", pA, size);
    dumpMat("b", pB, size);
    dumpMat("c", pC, size);
    }

    // Release memory of matrix a/b/c.
    free(a);
    free(b);
    free(c);
    free(pA);
    free(pB);
    free(pC);
    return 0;
    }

    キャンセル

  • 2018/07/03 13:34

    nが0じゃ、mallocで確保されるのは0バイトだし、その領域にアクセスしたらそりゃあ落ちるわな。

    キャンセル

  • 2018/07/03 13:47

    nの初期値を適当な数字に変更したら、ひとまずエラーは出なくなりました!
    行列のaとbの積がすべて0のままなのですが、これは計算式が間違っているのでしょうか?

    キャンセル

  • 2018/07/03 13:55

    あとは元々の質問内容から離れてしまうのであまり見る気が起きません。
    少しご自分で調べてみて無理そうならら改めて質問をしたほうがよいかと思います。
    そもそもaとbに値が入っているのか、という問題もあるでしょうから、デバッグ文を入れるなりして動きを確認してください。

    と、その前に、まずmallocが不慣れに感じたので、まずは固定長の配列で作ってみてうまくいったら、それをmallocに置き換えるとよいかもしれません。
    慣れていない人にとって今の処理は何が何やら状態に思えます。

    キャンセル

  • 2018/07/03 14:09

    ありがとうございます、もう少し自分で調べてみようと思います。
    とても助かりました!

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • C

    4004questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Vim

    532questions

    VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。