ポインタ

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ポインタ

Re: ポインタ

#6

by purin52002 » 7年前

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

内積は同じ次元のベクトルの各要素を掛け合わせたものの総和で、
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列目との内積を計算し、配列に格納すればいいと思います。

Re: ポインタ

#5

by かずま » 7年前

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

Re: ポインタ

#4

by かずま » 7年前

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

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

for文はご存知ですか?

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

Re: ポインタ

#3

by みけCAT » 7年前

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

Re: ポインタ

#2

by みけCAT » 7年前

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

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

ポインタ

#1

by みき » 7年前

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


}

ページトップ