ポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みき

ポインタ

#1

投稿記事 by みき » 3年前

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)
{


}

アバター
みけCAT
記事: 6398
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: ポインタ

#2

投稿記事 by みけCAT » 3年前

ソースコードを提示する際は、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も欲しかったところをコピペミスした?)が何をする関数なのかを教えてほしいです。

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

アバター
みけCAT
記事: 6398
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: ポインタ

#3

投稿記事 by みけCAT » 3年前

このプログラムがC言語だと仮定すると、ここでのReVecは関数ではなく配列なので、
みき さんが書きました: Vec =ReVec (Mat, Vec, ReVec);
という行はコンパイルエラーになります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: ポインタ

#4

投稿記事 by かずま » 3年前

なぜ、タイトルが「ポインタ」なんですか?
「行列とベクトルの積」などのほうがよかったのに。

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

for文はご存知ですか?

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

かずま

Re: ポインタ

#5

投稿記事 by かずま » 3年前

かずま さんが書きました:for文はご存知ですか?
すみません。最初のプログラムで for文を使っていますね。
この質問は無しです。

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: ポインタ

#6

投稿記事 by purin52002 » 3年前

ベクトルと行列の掛け算は内積を使って計算できますね。

内積は同じ次元のベクトルの各要素を掛け合わせたものの総和で、
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列目との内積を計算し、配列に格納すればいいと思います。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

返信

“C言語何でも質問掲示板” へ戻る