前提・実現したいこと
まず、q:0 0 0 0 0 1 1 0 を入力します。
そして、配列Dの1行と配列qを比較すると、コサイン類似度を表示するというプログラムを作りたいです。
ほとんどのプログラムは完成しているのですが、double cosine(int D[4],int q[8])に配列Dの部分配列を代入する方法が分かりません。
コメント頂けると幸いです。
発生している問題・エラーメッセージ
問題は、計算結果が正しく表示されないことです。0または、連続する数が出ます。 double cosine(int D[4],int q[8])の部分に D[4][8]のうちの一行分の要素の部分配列を仮引数に代入したです。 しかし、どうやったら部分配列をdouble cosine(int D[4],int q[8])の中に入れられるのかが分かりません。
該当のソース
C言語
1#include <stdio.h> 2 3int main(void) 4{ 5 int D[4][8] = { 6 {0,1,1,1,0,1,0,1}, 7 {0,0,0,0,1,1,1,0}, 8 {1,0,0,0,0,0,1,0}, 9 {0,1,0,0,1,0,0,0} 10 }; 11 int q[8]; 12 double res[4]; 13 14 printf("q:"); 15 scanf("%d %d %d %d %d %d %d %d",&q[0],&q[1],&q[2],&q[3],&q[4],&q[5],&q[6],&q[7]); 16 17 printf("d1とqの類似度:%.3f\n",res[0]); 18 printf("d2とqの類似度:%.3f\n",res[1]); 19 printf("d3とqの類似度:%.3f\n",res[2]); 20 printf("d4とqの類似度:%.3f\n",res[3]); 21 22 return 0; 23} 24double cosine(int D[4],int q[8]) 25{ 26 int i,k,l; 27 double y1=0,y2=0; 28 double sum=0,sum_d=0,sum_q=0; 29 30 for(i=0;i<8;i++){ 31 sum=D[i]*q[i]; 32 } 33 for(k=0;k<8;k++){ 34 sum_d+=D[k]*D[k]; 35 } 36 for(l=0;l<8;l++){ 37 sum_q+=q[l]*q[l]; 38 } 39 y1=sqrt(sum_d); 40 y2=sqrt(sum_q); 41 42 return sum/(y1*y2); 43} 44 45void similarity(int q[8],int D[4][8],double res[4]) 46{ 47 int i; 48 49 for(i=0;i<4;i++){ 50 res[i] = cosine(D[i],q); 51 } 52 53} 54
試したこと
double cosine(int D[4],int q[8])の部分で、配列D[]、D[8]にしましたが、求めている答えが得られませんでした。
補足情報(FW/ツールのバージョンなど)
コマンドプロンプト for VS 2019、サクラエディタを使用しています。
回答3件
あなたの回答
tips
プレビュー