練習として、ある入力を指定すると2つの行列を掛ける関数を書くことになっています。運動機能を書かれている方法は、次の形式になります乗算の結果がRESに書き込まれC++で行列を掛ける関数を書く
void Multiply(double **res, double **A, double **B, int ARows, int ACols, int BRows, int BCols);
。 上記のフォームがわかりません。私が理解できる限り、2つの行列のアドレスとその列と行の数を入力として取ります。しかし、resの入力はどのようにすべきですか(行列を乗算した結果です)?あらかじめ割り当てられた行列のアドレスが正しい次元でなければなりませんか?その場合、私は関数をテストするために次のように書いた(私は行列AとBも指定した)。
double** C;
C = new double [rows];
for (int i=0; i<rows; i++)
{
C[i] = new double [cols];
}
std::cout << Multiply(&C,&A,&B,Arows,Acols,Brows,Bcols) << "\n";
}
しかし、私は正しいとは思わない。ここでは乗算のための私のコードされる:乗算のための
void Multiply(double **res, double **A, double **B, int ARows, int ACols, int BRows, int BCols)
{
assert(ACols=BRows);
for (int k=0; k<BCols; k++)
{
for (int j=0; j<ARows; j++)
{
for (int i=0; i<ACols; i++)
{
res[j][k] += A[j][i]*B[i][k];
}
}
}
}
テスト:&C, &A, &B
を行う
int main()
{
int ARows = 2;
int ACols = 3;
int BRows = 3;
int BCols = 2;
int cols = ARows;
int rows = BCols;
double** A;
A = new double* [ARows];
for (int i=0; i<ARows; i++)
{
A[i] = new double [ACols];
}
double** B;
B = new double* [BRows];
for (int i=0; i<BRows; i++)
{
B[i] = new double [BCols];
}
A[0][0]=1;
A[0][1]=2;
A[0][2]=3;
A[1][0]=4;
A[1][1]=6;
A[1][2]=10;
B[0][0]=1;
B[0][1]=2;
B[1][0]=4;
B[1][1]=6;
B[2][0]=13;
B[2][1]=9;
double** C;
C = new double* [rows];
for (int i=0; i<rows; i++)
{
C[i] = new double [cols];
}
std::cout << Multiply(C,A,B,ARows,ACols,BRows,BCols) << "\n";
}
乗算はres' 'は' 'ダブル**を期待し、 'C'はすでに' 'ダブル**であるとして、関数に渡す'&C'する必要はありません。とプレーンな 'C'を渡すだけで十分です。さらに、すでにポインタであるため、関数は指摘されたコンテンツを埋めることができます。 –