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

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

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

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

Q&A

1回答

9071閲覧

ベクトルの内積と直積を関数を用いて

ryu72639

総合スコア14

C

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

0グッド

0クリップ

投稿2018/06/25 14:10

下のような文章に沿ったプログラムを書きたいです。内積はすんなり出せたのですが、直積を求める時に計算も違うし、表示の仕方もわかりません。どうすればいいのでしょうか?

任意の次元数nのベクトルを2個入力させ,作成した関数を用いて内積と直積とを計算し,結果を表示するプログラムを作成せよ. ただし,次元数nの最大値は100とし,それぞれの関数は以下の基準に従うこと.

内積(inner product)

double inner_product ( const double vectA[], const double vectB[], int n)
引数として与えられた実数型配列vectA, vectBをそれぞれ n 次元ベクトルと見なし,内積を算出する.返却値は算出された内積とする.

直積(outer product)

void outer_product ( const double vectA[], const double vectB[], int n, double M[][])
引数として与えられた実数型配列vectA, vectBをそれぞれ n 次元ベクトルと見なし,直積を算出する.算出された行列(テンソル)は引数で与えられた実数型2次元配列 M に格納する. 上記宣言の
の部分には正しい数値(オブジェクト形式マクロでも良い)を入れる必要がある.

C

1 #include <stdio.h> 2 3/*内積を求める関数*/ 4 double inner_product ( const double vectA[], const double vectB[], int n) 5{ 6 int i; 7 double answer; 8 for ( i = 0 ; i < n; i ++ ){ 9 answer += vectA[i] * vectB[i]; 10 } 11 return answer; 12} 13 14/* 直積を求める関数 */ 15 void outer_product ( const double vectA[], const double vectB[], int n, double M[][100]) 16{ 17 int i, j, k; 18 double vecta[1][100]; 19 double vectb[100][1]; 20 double answer[i][j]; 21 22 for ( i = 0 ; i < n ; i++ ) { 23 vecta[0][i] = vectA[i]; 24 vectb[i][0] = vectB[i]; 25 } 26 for ( i = 0; i <n; i++ ) { 27 for ( j = 0 ; j < n ; j++ ) { 28 M[i][j] = 0.0; 29 M[i][j] += vecta[0][i] * vectb[i][0]; 30 printf("%4.2f", M[i][j]); 31 putchar('\n'); 32 } 33 } 34} 35 int main(void) 36{ 37 int n = 100; 38 double vecta [100]; 39 double vectb [100]; 40 double vectc [100]; 41 double answer[100][100]; 42 double ANSWER[100][100]; 43 int i = 0; 44 double naiseki; 45 int j = 0; 46 int k= 0; 47 48 49 naiseki = 0; 50 51 printf("ベクトルの次数は?"); 52 scanf("%d", &n); 53 54 printf("ベクトルAを入力して下さい"); 55 for (i = 0; i < n; i ++){ 56 scanf("%lf", &vecta[i]); 57 } 58 59 printf("ベクトルBを入力して下さい"); 60 for (i = 0; i < n; i ++){ 61 scanf("%lf", &vectb[i]); 62 } 63 64 printf("ベクトルA = "); 65 for (i = 0; i < n; i++){ 66 printf("%.2f ", vecta[i]); 67 } 68 69 printf("\nベクトルB = "); 70 for (i = 0; i < n; i++){ 71 printf(" %.2f ", vectb[i]); 72 } 73 74 printf("\n"); 75 76 naiseki = inner_product ( vecta, vectb, n ); 77 78 printf("内積:%.2f\n", naiseki); 79 80 answer[0][0] = 0; 81 printf("直積:"); 82 outer_product(vecta, vectb, n, answer); 83 84 printf("\n"); 85 86 return 0; 87} 88

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

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

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

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

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

guest

回答1

0

内積の方はanswerが初期化されていないので0を代入しておいてください。
(試験では、あとで+=する変数の0初期化を忘れると大抵バツにされると思います。)

double answer = 0; ←初期化

直積の方はwikipediaを見た感じではベクトルAとベクトルBの要素を組み合わせで掛け算しているだけのようですので、組み合わせ方は以下のように書けばよいのかなと思います。

c

1 int i, j, n = 4; 2 for (i = 0; i < n; i++) { 3 for (j = 0; j < n; j++) { 4 printf("%d%d ", i, j); 5 } 6 printf("\n"); 7 }

組み合わせ確認用の出力結果:

text

100 01 02 03 210 11 12 13 320 21 22 23 430 31 32 33

実装するならこうでしょうかね。

c

1void outer_product ( const double vectA[], const double vectB[], int n, double M[][100]) { 2 int i, j; 3 for (i = 0; i < n; i++) { 4 for (j = 0; j < n; j++) { 5 M[i][j] = vectA[i] * vectB[j]; 6 } 7 } 8}

表示の仕方もわかりません。

そもそも表示の仕方は指示されているんでしょうかね?
(問題文を見た限りでは指示されていませんが)

もし確認するのであればouter_productの中ではなく、mainでouter_productを呼び出した後に書けばいいのかなと思います。

投稿2018/06/26 01:41

編集2018/06/26 02:55
takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問