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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Vim

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

Q&A

1回答

1606閲覧

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

yu_yu_yu

総合スコア6

C

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

Vim

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

0グッド

0クリップ

投稿2018/07/03 02:09

前提・実現したいこと

行列積の計算を、指定したサイズで行うようにしたいです。
サイズの指定は、オプションで指定するようにしてあり、変数 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(nnsizeof(double));
b = malloc(nnsizeof(double));
c = malloc(nnsizeof(double));

for(i = 0; i<nn;i++){
a[i] = malloc(n
nsizeof(double));
b[i] = malloc(n
nsizeof(double));
c[i] = malloc(n
nsizeof(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 + in;
pB[i] = b + in;
pC[i] = c + in;
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を使って書いています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

投稿2018/07/03 02:54

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_yu_yu

2018/07/03 03:12

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

2018/07/03 04:07

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

2018/07/03 04: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; }
ttyp03

2018/07/03 04:34

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

2018/07/03 04:47

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

2018/07/03 04:55

あとは元々の質問内容から離れてしまうのであまり見る気が起きません。 少しご自分で調べてみて無理そうならら改めて質問をしたほうがよいかと思います。 そもそもaとbに値が入っているのか、という問題もあるでしょうから、デバッグ文を入れるなりして動きを確認してください。 と、その前に、まずmallocが不慣れに感じたので、まずは固定長の配列で作ってみてうまくいったら、それをmallocに置き換えるとよいかもしれません。 慣れていない人にとって今の処理は何が何やら状態に思えます。
yu_yu_yu

2018/07/03 05:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問