質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

7回答

2895閲覧

流体計算はc言語よりもc++で実装したほうが良いのでしょうか??

Akihiro_O

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/13 14:22

##知りたいこと
流体計算(有限差分法、有限要素法、有限体積法)を行う上で、C言語を基礎にした上で「C++言語」も知っておいたほうが良いのでしょうか。
また、流体計算におけるC++のメリット(c言語には出来ないこと)なども教えて頂けると幸いです。
もしくはアルゴリズムなどを勉強することを優先すべきでしょうか。

##自己紹介
大学院で流体計算をc言語で行っている者です。
c言語と流体計算はまだ始めたばかりで、どちらも初心者です。
流体計算の学習に関しては、「有限差分法」を用いて偏微分方程式の計算をしています。
(今後、有限要素法や有限体積法を学習するかは分かりません。)
c言語学習に関しては、書籍「苦しんで覚えるc言語」を2周ほどやりこみ、書籍の内容は理解しました。
今、少し時間があるので、もしc言語よりも記述が簡単で計算速度が速くなるなどのメリットがあれば、c++言語の学習を始めようと思っています。 
今後c言語以外の言語(python,R,MATLABなど)でプログラムを組むかは未定です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

ベストアンサー

こんにちは。

超高速な流体計算アルゴリズムの研究をされている場合はC言語の方が向いていると思います。
C++は実行速度をほとんど落とさずに生産性を上げる言語です。その代償は学習コストです。
ですので、僅かな速度低下が許せないような分野ではC言語の方が言語の学習に時間をさかないで良い分、向いていると思います。

とはいえ、C++はC言語のほぼアッパーコンパチですから、ギチギチに最適化が必要な僅かな部分だけピュアなC言語やアセンブラで記述し、僅かな速度低下が許せる部分(恐らく大半の部分)はC++で書くとメンテナンスしやすく、かつ、高速なプログラムを書けると思います。
その分、学習はたいへんですが、何も全てのC++の機能を使う必要はないです。例えば、文字列を使うケースは意外に多いと思いますが、そこにギチギチの高速化は通常は不要でしょう。そのような部分にstd::stringを使うと開発時間を結構短縮できます。その短縮できた時間を高速化のために用いると良いと思います。

投稿2019/01/13 15:09

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 01:25

回答有り難うございます。 大変勉強になりました。 少し質問させていただいてもよろしいでしょうか。 ①まだc言語も初心者なので、始めのうちはcで実装をしてみて数値計算に慣れ、高速化について考えていくという手順がよろしいでしょうか。 ②それから必要になればc++の学習に入っていけばよろしいでしょうか。 素人な質問で申し訳ございません。
Chironian

2019/01/14 07:45

C++を学ぶにしてもC言語はその基礎にあたりますので、C言語から入るのは良い順序と思います。 ただ、C言語の標準ライブラリは設計が古く、使いこなそうとすると苦労が多い割に他への応用が聞きません。(単に設計が古いことが問題なので他の言語は既に克服しています。) なので、標準ライブラリについてはC言語のコア仕様を学ぶために必要最小限にしておいた方がスムーズと思います。
Akihiro_O

2019/01/14 11:44

大変貴重なお話を有難うございます。 勉強になりました。
guest

0

超高速計算を必要とするプログラミングの設計からは話が逸れますが、
発表で視覚的な表現を必要とする、計算で貯めてきた大規模なデータを扱う、機械学習をさせるなどで
R言語ベースの自作パッケージを開発する際は、プロジェクトにRcppを組み込むことでC++が使えます。

R言語は未定とのことなので、これは小耳に挟む程度で(-ω-)/

投稿2019/01/14 02:54

fermat

総合スコア183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 03:07

有難うございます。 勉強になりました。
guest

0

遥か昔のことを思い出します.
学生のころ,流体じゃなくて剛体の物理シミュでしたが
まさにCしか知らない状態でC++の要素をつまみ食いしながら実装しました.
(「Better C」って呼ばれる状態かな?)

で,「あえてCという枠組みの中で書く」必要がないならば,「まずはCだけで実装…」みたいなステップは不要に思います.
実装に先立って,とりあえずちょっとだけC++のさわりを学んでみればよいかと.
「C++の学習コスト」的な話が問題にならない程度に覗き見するだけでも
使える要素がいくつか見つかると思います.

例えば,構造体にコンストラクタ書けるだけでも便利.
std::vectorやらlistやらの恩恵を受けるだけでも「全部C」とは比較にならないほど便利.

投稿2019/01/14 02:44

fana

総合スコア11634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 11:40

有難うございます。 確かにc++のさわりだけでも知っておいたほうがcの実装の時に役に立ちそうですよね。 逆に全くc++の知識が無いまま闇雲にcで実装していると、それはそれで時間をロスしてしまうかもしれません。 自分の時間と相談して今後のc++学習を進めていきたいと思います。 ありがとうございました。
guest

0

今、少し時間があるので、もしc言語よりも記述が簡単で計算速度が速くなるなどのメリットがあれば、c++言語の学習を始めようと思っています。

数値計算という条件では、C++にするメリットは「演算子オーバーロード」(たとえば、複素数どうしの演算も+など演算子を使える)が可能なことぐらいではないかと思います。

そして、本格的に演算を行うとなれば専門のライブラリの出番ですので、自分が書くコードは入出力の調整と、ライブラリの演算ルーチンを呼び出しての組み合わせ、という感じとなって、演算速度や使用する言語はライブラリ次第、ということになります(CPUやGPUのメーカーなどが、極限までチューニングしたライブラリを用意していますので、一般人には太刀打ちできない性能が出ます)。「Pythonで機械学習」が成り立つのも、コア部分のライブラリが超高速に動いてこそです。

投稿2019/01/13 14:49

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 01:18

回答ありがとうございます。 複素数を扱わなければc言語で事足りると解釈してよろしいでしょうか。 また素人がいくらアルゴリズムを考えてコードを組んだとしても、専門のライブラリを使う以上それほど速度差は出ないと判断したほうがよろしいのでしょうか。 素人な質問で申し訳ございません。
maisumakun

2019/01/14 01:25

複素数はあくまで一例で、Chironianさんも挙げているように文字列のハンドリングでもC++のほうが便利です。 (俗に、完全にC++で書くわけではなく、大半はC言語的な書き方で、便利な部分だけC++を使う、というような書き方を「Better C」と呼んだりもします) あと、ライブラリを使う場合、「素人がアルゴリズムを考えてコードを組」まないです。ライブラリにある、たとえば「行列積」や「逆行列演算」のような、ある程度の大きさのある部品をどう組み合わせるかが、プログラミングとなってきます。
Akihiro_O

2019/01/14 01:37

ありがとうございます。 大変貴重な助言感謝いたします。
guest

0

あえてC++にしないでCにする理由は、よほど特殊なケースを除いてないでしょう。

でも、CにしろC++にしろそれなりに大変です。

とにかく計算を速くしたい、という要望があればコンパイル言語(C, C++, あと一応Fortranも選択肢に入るか……)でゴリゴリ書いていくしかありません。

それより1桁くらいは遅くて良いのでさっさと実装して肝心の研究にリソースを割きたい、という事情であればpythonもおすすめです。numpyなどのライブラリを使えば相応に高速に実行されます。なんならcupyを使うとほぼ同じ記述でGPGPUもいけます(使うところをよく考えないと速くならないかもしれませんが)。

コンパイル言語で書いて10秒で回るプログラムはスクリプトで書けば100秒くらいで回るはずで、それくらいなら待てば良いでしょう。でも1時間が10時間になっちゃったら、ちょっと困る訳で(寝てる間に回すという手もなくはないが)、そのへんをよく考えて選ぶ必要があります。

RとMATLABも原理的にはpythonと同等のことができますが、言語やライブラリの出来不出来と流行り具合(情報の多さに影響する)を考えると、Rは微妙、MATLABはいろいろ厳しいというポジションになります。昨今は科学技術計算をスクリプトから叩こうと思ったら、たいていはpython使うことになると思います。

投稿2019/01/14 12:03

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 12:36

貴重なご意見を有難うございます。 pythonの有用性について少しわかった気がします。
guest

0

高度な科学技術計算ではC言語は厳しいと思います。
というのも、C言語には大量のデータを安全に取り扱う仕組みがありません。メモリの取り扱いをちょっと誤ると簡単に暴走したりフリーズしたりします。なんかよく判らないけど結果がおかしい、なんてことも起こり得ます。
メモリの取り扱いの不備による不具合は、原因究明がとても困難なケースが多いです。そんなことに無駄に時間を使ってしまっては、研究の妨げになるのではないでしょうか。

PythonはC言語に比べると処理速度は桁違いに遅いですが、それでも研究分野で広く使われている要因の一つは、大量のデータを安全に(しかも直感的に)扱う仕組みが提供されているところにあると思います。いくら処理速度が速くても余計なところに時間を取られては意味ないですからね。

C++はどうかというと、C言語の弱点を見事に克服しています。大量のデータを安全かつ直感的に扱う仕組みが提供されていますし、例外処理により障害耐性を向上させることもできます。しかも処理速度はほぼC言語並みです。場合によってはC言語を上回ることもあります。
その代わり、習得難易度はとても高いです。

投稿2019/01/14 01:41

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 01:50

大変貴重なアドバイスを有り難うございます。 一つ質問させて頂いてもよろしいでしょうか。 maisumakunさんから「Better C」という考え方を学びました。 まずはじめはcで実装してみて、それから必要な部分だけc++で書き換えてみるのが効率的でしょうか。
catsforepaw

2019/01/14 02:06

それで良いと思います。私もそうでしたから。 C++はC言語の仕様を(まったく同じではないものの)ほぼ丸ごと受け継いでいるので、maisumakunさんのおっしゃるように、Cのスタイルでプログラムを組みつつ、部分的にC++の便利な機能を利用するという方法(=Better C)は、C++習得の過程で誰もが通る道です。 たとえば、メモリ管理の観点で言うと、C++で大量のデータを扱う場合に「コンテナ」というものを利用するのですが、その使い方を覚えればメモリ確保・解放の煩雑さから解放されます。
Akihiro_O

2019/01/14 02:32

有難うございます。 非常に勉強になりました。
guest

0

話が漠然としており、適切な回答は得られないと思います。

流体解析に詳しくありませんが、一般論的にアプリケートの観点から言語を選ぶならば、その分野で有効なライブラリやAPIを持った言語が有力です。要するに**「周りの人に合わせることが無難」**程度の回答しかできません。

投稿2019/01/13 14:51

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_O

2019/01/14 01:20

貴重なご意見を頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問