実現したいこと
100 種類の連立一次方程式 Ai*x = bi, i = 1, 2, . . . , 100 を単純 Gauss の消去法で解き,得られた近似解 xi に対する残差 2 ノルム ∥bi − Aixi∥2 や計算時間を求めたいです。このとき、行列サイズは 5 × 5とし,成分は右辺項も含めてすべて [0, 1) 上の乱数にしたいです。
発生している問題・分からないこと
自分が作ったコードはエラーが出ずに動くのですが、[0,1)上の乱数になっているのかがよくわかりませんでした。これは正しく実装できているのでしょうか。c++ではRAND_MAXを使うと[0,1)の範囲にならないという記事を見たのですが、改善の仕方がわかりません。また、この実装は1回しか行われないのですが、100種類調べたいので本当は100回繰り返したいです。どのように書けば良いのでしょうか。ご教示いただきたいです。よろしくお願いいたします。
該当のソースコード
c++
1//Gauss-消去法(帯行列、大きいサイズ) 2 3#include <math.h> 4#include <stdio.h> 5#include <iostream> 6#include "LinearAlgebra.hpp" 7 8int main(){ 9 //ここでAとbどんなものか書く 10 vector<vector<double> >A(5,vector<double>(5)); 11 vector<double> b(5); 12 //vector<double> x(5); 13 14 for(int i=0;i<5;i++){ 15 for(int j=0;j<5;j++){ 16 A[i][j]=(double)rand()/RAND_MAX; 17 } 18 b[i]=(double)rand()/RAND_MAX; 19 } 20 21 //行列Aを表示 22 cout<<"A="<<endl; 23 printMatrix(A); 24 25 //ベクトルbを表示 26 cout<<"b="<<endl; 27 printVector(b); 28 29 //前身消去した後のAとbを表示 30 vector<double> x(5); 31 32 x = GaussianElimination(A,b); 33 34 //後退代入過程を用いた解xを表示 35 cout<<"x="<<endl; 36 printVector(x); 37}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
RAND_MAXを消すと[0,1)上になりませんでした。
補足
特になし
> RAND_MAXを使うと[0,1)の範囲にならない
参考になるかも
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1294991792
確かに、ちょうどになるパターンを忘れていた...どちらにしてもstd::generate_canonicalを使えばいいですね。
質問者さん
> エディタmiを使って
「mi」
https://www.mimikaki.net/
を使ってるならmacでしょうから、コンパイラは、xcodeのclangか、brewで入れたgccか、そのあたりですかね
> unknown type name 'constexpr'
コンパイル時のコンパイラのオプションに
「-std=c++11」
を付けてみてください
参考
https://stackoverflow.com/questions/45047508/error-unknown-type-name-constexpr-during-make-in-mac-os-x
https://github.com/tesseract-ocr/tesseract/issues/3295
回答ありがとうございます。
コンパイル時のコンパイラとはどのことでしょうか。教えていただきたいです。
できました!!!ありがとうございます。
1つ質問なのですが
g++ -c mainn.cpp -o mainn.out
//g++ -c LinearAlgebra.cpp -o LinearAlgebra.out
//g++ mainn.out LinearAlgebra.out
./a.out
とうって実行しているのですが、4つ全ての後ろに-std=c++11がいるのでしょうか。どれかにつければいいのでしょうか。
LinearAlgebra.cppが何だかわかりませんが、2行目と3行目のコメントを外して、1~3行目ともに-std=c++11を付けて、私が最初に提示したC++の方法を試してみてほしいです。
それで上手くいったら、評価をお願いします。
上手くいかなかったら、エラーメッセージを貼ってください。勉強になるので。
うまくいきました。ありがとうございます。本当に助かりました。
> 4つ全ての後ろに-std=c++11がいるのでしょうか。
この質問の「該当のソースコード」が「mainn.cpp」で、hiroki-oさんの回答の最初の(「constexpr」とかが有る)コードのように変更するのなら、
g++ -std=c++11 -c mainn.cpp -o mainn.out
とします
g++ -c LinearAlgebra.cpp -o LinearAlgebra.out
にも同様に「-std=c++11」を付ける必要が有るかは、「LinearAlgebra.cpp」の内容次第ですので、まずは付けずに実行してみて、エラーが出たら付けて実行してみてください
g++ mainn.out LinearAlgebra.out
./a.out
には付ける必要は無いと思います
「-std=c++11」オプションのように言語バージョンを指定する場合、無用なトラブルを防ぐためにプロジェクト内の全 g++ コマンドに指定したほうが良いです。
(C++標準ライブラリ内でコード分岐している可能性があり、不統一状態でコンパイルされたオブジェクトファイル群をリンクするときにABI不一致を引き起こすことがあります)
回答1件
あなたの回答
tips
プレビュー