- 締切済み
Octaveについて
つぎなようなプログラミングをしたいとき a=[1:0.1:2]; b=1.2; c=sqrt(a.^2-b); d=[3.^(c*3),3.^(-c*3);c.*3.^(c*3),-c.*3.^(-c*3)]; これで、dはaが1から2を0.1きざみで変化する時の行列のあたいを返してくれるとおもったのですが,ためしにa=1のときの値を計算してみたら最初の値と計算結果が違いました。 調べたのですがどのようにしたらよいかわからなかったので、質問させてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- cametan_42
- ベストアンサー率62% (162/261)
>あまり(.)の記号の意味がよくわかっていません。ある変化する値に対して一つ一つ対応するよ。ということなのでしょうか? と言うより、ベクトル、ないしは行列の要素に対して指定した計算結果を返す、と言うことです。 例えば、 octave:1> a=2 a = 2 とした場合、 octave:2> a^2 ans = 4 octave:3> a.^2 ans = 4 と、要素数が一つしか無い場合、同じ計算結果を返しますね。 一方、aがベクトル、例えば octave:1> a=[2, 4] a = 2 4 だった場合、 octave:2> a^2 error: for A^b, A must be square error: evaluating binary operator `^' near line 2, column 2 とエラーを返しますが、 octave:2> a.^2 ans = 4 16 とドットをつけると「要素に対して」演算を実行してエラーにはなりません。 つまり、3行目までの計算を考えると、 octave:1> a=[1:0.1:2]; octave:2> b=1.2; octave:3> c=sqrt(a.^2-b) c = Columns 1 through 3: 0.00000 + 0.44721i 0.10000 + 0.00000i 0.48990 + 0.00000i Columns 4 through 6: 0.70000 + 0.00000i 0.87178 + 0.00000i 1.02470 + 0.00000i Columns 7 through 9: 1.16619 + 0.00000i 1.30000 + 0.00000i 1.42829 + 0.00000i Columns 10 and 11: 1.55242 + 0.00000i 1.67332 + 0.00000i となり、仮にa=1の計算を実行しても octave:1> a=1; octave:2> b=1.2; octave:3> c=sqrt(a.^2-b) c = 0.00000 + 0.44721i と先ほどの計算の最初の値と一致していますね。 問題は4行目なのです。 そもそもaがベクトルだった場合、cの計算で得られる値もベクトルですし、実数のベクトル乗、と言う行列になるんで、「少々異常な計算」になるのも当たり前ですよね。 aが普通の数値でしたら、得られる結果は単に数値なので「素直な行列」が得られる。 違って当たり前だと思いますよ。 MatlabやOctaveの場合、コードの作成中は行末のセミコロン(;)を外してみて計算過程を逐次確かめた方がいいと思います。 確かに、完成形でのソースでは全ての実行結果を表示させる必要性はむしろ無いのですが、ソースを作る段階では怪しい部分はセミコロンを外して返り値を調べてみてください。
- cametan_42
- ベストアンサー率62% (162/261)
>調べたのですがどのようにしたらよいかわからなかったので、質問させてください。 と言うより、何がしたいのか良く分かりません。 ベクトルの状態で一気に計算すると、計算結果は「0.1刻み」ではなくって、計算に用いた数値に何らかの計算を適用した結果が出るのは当然だ、と思えるんですが? 少々説明不足ですね。
補足
dの行列の各成分が、aに(1を代入した値)、(1.1を代入した値)・・・ という11個の行列が計算されると思ったのですが、同じプログラムでa=1を代入した時を検算として計算してみたのですが、その結果がその前に出力された最初の値と一致しないということです。 あと、あまり(.)の記号の意味がよくわかっていません。ある変化する値に対して一つ一つ対応するよ。ということなのでしょうか?
お礼
ありがとうございました。