float 型の 2 つの 1-D 配列のスカラー積を返す C 関数 sprod (n,x,y) を記述します。この関数は、入力変数として配列のサイズ n (型 int 変数) と、各配列の最初のメンバーへのポインター x と y を取り、float の結果を返します。main() コード ブロックは、sprod を呼び出して行列積 a*b を計算する必要があります。ここで、float 行列 a 型と float ベクトル b 型は、b=[1 1 1] と a=[1 2 3 4 5 6 7 8 で指定されます。 9] (a は 3x3 行列)。
b を af(;;) ループで初期化し、a を double for(;;) ループで初期化できます (または、多くの割り当てステートメントを使用します)。行列積は、関数 sprod の呼び出しを使用して計算し、a の各行とベクトル b のスカラー積を形成する必要があります。これらの行へのポインターは、a[1]、a[2]、および a[3] によって与えられます。最後に、結果のスカラー積を合計する for(;;) ループと、結果を画面に出力する printf() 関数も使用する必要があります。
結果は、行列 a のすべての要素の合計になります。行列 a とベクトル b のコピーも印刷する必要があります。Numerical Recipes C 関数の matrix() と vector() を free_matrix() と free_vector() と共に使用して、動的に定義された配列として a と b を作成します。
私はプログラミングに関しては初心者で、本当に苦手であることがわかりました。これは私がこれまでに持っていたもので、コンパイルすると狂ったように爆発します (いくつかのものが省略されていることは知っています)。gdb を使用してデバッグしようとしましたが、それも機能しませんでした。どんな助けでも大歓迎です。
# include <stdio.h>
# include "nrutil.h"
# include "nrutil.c"
void transp(float **a,int n);
float sprod(int n, float *x, float *y);
int main()
{
int i,j;
float var=0.0, sum=0.0, pro=0.0;
float*b, **a;
int n=3;
float index;
b=vector(0,n-1);
a=matrix(0,n-1,0,n-1);
printf("\nVector b\n");
for(j=0;j<n;j++)
{
b[j]=1;
printf("%.2f\n",b[j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++);
{
var=var+1;
a[i][j]=var;
}
}
printf("\n Matrix a\n");
for(i=0;i<n;i++);
{
for(j=0;j<n;j++);
{
printf("%.2lf",a[i][j]);
}
printf("\n");
}
printf("\nProduct of Matrix a and Vector b\n");
for(i=0;i<n;i++);
{
pro=sprod(n,a[i],b);
printf("%.2f\n",pro);
sum+=pro;
}
printf("\n Sum of Product array\n");
printf("%.2f\n\n", sum);
free_ivector(index,0,n-1);
free_matrix(a,0,n-1,0,n-1);
return 0;
}
float sprod(int n, float *x, float *y)
{
float scalar=0.0;
int j=0;
int sum=0;
for(j=0;j<n;j++);
{
scalar+=x[j]*y[j];
}
return scalar;
}
これを最初に投稿してから、コードを改良しました。今ではほとんど動作しますが、コードの free_ivector ビットの 50 行目で問題が発生しています。ターミナルは、「free_ivector」の引数 1 の型に互換性がないことを通知します。それが何を意味するのかよくわかりません。このコードは、以下の最初の回答で David Duncan が提案したものの全体的な書式設定を採用しています。