ページ 11

ポインタ

Posted: 2017年5月27日(土) 21:48
by みき
3行3列の行列と3次元ベクトルの積を求めるプログラム。
途中まで作ったんですけど、oid MatPro(double(*Mat)[3], double *Vec, double *ReVec)とvoid MatPro(double(*Mat)[3], double *Vec, double *ReVec)ここの宣言の後から何を書けばいいのかよくわからなくて
教えてほしいです。

#include<stdio.h>

void MatPro(double(*Mat)[3], double *Vec, double *ReVec);
double innerp(int n, double *a, double *b);

int main(void)
{
double Mat[3][3] = { {12,34,82},{43,80,-54},{56,31,78}};
double Vec[3] = { 2,64,32 }, ReVec[3];
int i;

Vec =ReVec (Mat, Vec, ReVec);

printf("output=Mat[3][3](input)*Vec[3](input)\n");

for (i = 0;i < 3;i++)
printf("|%7.2f| |%6.2f %6.2f %6.2f| |%6.2f|\n", *(ReVec + i), *(*(Mat + i)), *(*(Mat + i) + 1), *(*(Mat + i) + 2), *(Vec + i));

return 0;
}
void MatPro(double(*Mat)[3], double *Vec, double *ReVec)
{



}
double innerp(int n, double *a, double *b)
{


}

Re: ポインタ

Posted: 2017年5月27日(土) 21:58
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
みき さんが書きました:oid MatPro(double(*Mat)[3], double *Vec, double *ReVec)とvoid MatPro(double(*Mat)[3], double *Vec, double *ReVec)ここの宣言の後から何を書けばいいのかよくわからなくて
教えてほしいです。
まず、MatPro(とinnerp : MatProが2個あるが、innerpも欲しかったところをコピペミスした?)が何をする関数なのかを教えてほしいです。

次に、行列とベクトルの積を求める(数学上の)方法(もしくは定義)はわかりますか?
それがわかったら、それを求める具体的な方法(アルゴリズム)はわかりますか?
試してみてエラーが出たプログラムがあるなら、それを提示していただけると修正できるかもしれません。

Re: ポインタ

Posted: 2017年5月27日(土) 22:00
by みけCAT
このプログラムがC言語だと仮定すると、ここでのReVecは関数ではなく配列なので、
みき さんが書きました: Vec =ReVec (Mat, Vec, ReVec);
という行はコンパイルエラーになります。

Re: ポインタ

Posted: 2017年5月28日(日) 02:04
by かずま
なぜ、タイトルが「ポインタ」なんですか?
「行列とベクトルの積」などのほうがよかったのに。

ポインタの学習だから、Mat[2] と書かずに、
*(*(Mat + i) + 2) と書くように、と指定されているのですか?

for文はご存知ですか?

これらの質問に答えてもらえると、
行列とベクトルの積のサンプルプログラムをお見せしましょう。

Re: ポインタ

Posted: 2017年5月28日(日) 02:06
by かずま
かずま さんが書きました:for文はご存知ですか?
すみません。最初のプログラムで for文を使っていますね。
この質問は無しです。

Re: ポインタ

Posted: 2017年5月28日(日) 12:47
by purin52002
ベクトルと行列の掛け算は内積を使って計算できますね。

内積は同じ次元のベクトルの各要素を掛け合わせたものの総和で、
n次元のベクトルA,Bの場合、

ΣA(i)*B(i)|i=1~n

になると思います。(あってるかな?)
これはfor文をn回回して、A,Bの同じindexの要素をかけたものを足し合わせればいいと思います。

次に、ベクトルと行列の掛け算です。
文字だけで説明するのが私ではちょっと難しいので、説明は省略します^^;
とりあえず計算方法だけ説明します。

ベクトルA,Bの内積をdot(A,B)として、ベクトルXと行列Y(i行j列)の掛け算は

[ dot( X,Y( :,1 ) ) dot( X,Y( :,2 ) ) ... dot( X,Y( :,j ) ]

ここでXの次元数とYの高さは同じ必要があります。
これはfor文をj回回して、XとYのj列目との内積を計算し、配列に格納すればいいと思います。