• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:matlabでの長時間の計算について)

matlabでの長時間の計算について

このQ&Aのポイント
  • matlabで数十分かかると考えられる計算を行う際のデータ保存方法についてのアドバイスをお願いします。
  • 長時間の計算を行う際にメモリ不足にならないか心配です。使用している計算機のメモリは992.8MiBですが、問題ないでしょうか?
  • 配列の要素を一部ずつプロットする方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.3

A No.1のKulesです。 waterfall(u(1 :50000000/100 :50000000, 1 :200/10 :200)); この書き方も相当危ないですが(真ん中の増分が今は整数なのでいいですが、ここが整数でなくなった時点でエラーが出ます)今は問題なく動くのでいいでしょう。 http://www.mathworks.co.jp/help/ja_JP/techdoc/ref/waterfall.html の説明はお読みいただけましたか? >waterfall(Z) は x = 1:size(Z,2) と y = 1:size(Z,1) を使用してウォーターフォール プロットを作成します(サイト内説明より) なので、入力が一つなら縦軸、横軸の番号がそのまま出力されます。 また、 > X と Y がベクトルの場合、X は Z の列に対応し、Y はその行に対応します(サイト内説明より) なので、X,Yにベクトルを入れる場合はZの列数とXの要素数が、Zの行数とYの要素数があってないといけません。 x = linspace( -20, 20, 200 );→要素数200 t = linspace( 0, 50000000, 100 );→要素数100 に対し u(1:100:end,1:end)→500000行200列 なので行数があっていません。 そもそも 1 :50000000/100 :50000000 と 1:100:end は表しているものが違います。 1 :50000000/100 :50000000 と linspace( 0, 50000000, 100 ) は要素数が同じ…だと思います(数字がでかすぎて自信ないです(笑)) ちなみに CAT arguments dimensions are not consistent. は、行列をくっつける時にサイズの不一致が起きた場合のエラーのはずなので、少なくともここに書かれているものが原因ではないと思われます。 参考になれば幸いです。

その他の回答 (2)

回答No.2

> 計算後の大容量のデータは一般的にどのように保存すべきでしょうか? > saveを使ってworkspace内の変数(全て)をそれぞれ保存していくというものです。 saveを使うのはいいけど、すべて保存する意味はないと思いますが・・・・。 時間とメモリの無駄です。必要な変数だけsaveで保存したほうがよいです。 save filename data1 data2 > 計算機を走らせている間、動作が著しく重くなり、ほとんど他の作業が出来なくなります。 > (これは避けられませんよね・・?) OSによっては優先順位下げれるけど、時間かかりますよ。 > 問題は途中でメモリ不足などで計算がストップしてしまわないかということです・・ > パラメータ毎の目的の変数(6つ)は、多いとそれぞれ10^6×200ほどの配列となる可能性があります。 matlabは必要なメモリは予め確保したほうが良いです。10^6×200いるのであれば、 予め10^6×200確保しておくべきですが、992.8MiBじゃ無理っぽいですね。double型なら普通にオーバーするだろうし・・・仮想メモリ使いまくりですね。 > 1行目から、一定数(例えば100)毎の行の配列を > グラフにプロットさせたいのですが、やり方がわかりません・・ mesh(u(1:100,1:end)) とか。 もしくはimageとか。

hyenaydtekie
質問者

補足

ご回答ありがとうございます. mesh(u(1:100,1:end))を参考に, waterfall(u(1:100:50000000,1:200)); とし、 uの行の要素を100毎にプロットできたんですけど、 x,yの座標の両端が、行列の番号がそのまま出力されてしまいます。 x軸の末端の値を-10,10 y軸の末端の値を0,50000000/100 ってしたいんですけど、 xlimやylimを使っても上手く逝かないし、 x = linspace( -20, 20, 200 ); t = linspace( 0, 50000000, 100 ); waterfall(x,t,u(1:100:end,1:end)); とやっても CAT arguments dimensions are not consistent. って出ます。 何か成す術はないものでしょうか・・?

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

そうですね… まあfigureにプロットしているデータだけでいいのであれば、 saveasを用いてjpeg形式で保存するのではなく、figのまま保存すればいいでしょうね。 figureをfigファイルで保存しておけば、後で立ち上げた時に見てくれ(各軸のスケールやviewで決まる角度、camerapositionなど)はいくらでも変更できますし。 jpeg形式も同時に保存しておけば、画像を手早くチェックして変更が必要なものだけfigファイルからいじるようにすればいいですね。 メモリに関してはわかんないですね…少なくとも私が現在使ってる脆弱な環境では間違いなく止まるレベルですね(笑) 100万×200×6×8(doubleで持った時の、1要素あたりのバイト数)=96億バイト≒9ギガバイトなんで、きつそうな気はしますけどこんな計算でいいのかな?ごめんなさいここは自信ないです。 x = -10: 10: 200 ; t = 0: 100: 50000000 ; waterfall(x,t,u) ; とするとエラーが出ます。 多分「配列の要素数は一致する必要があります」みたいなエラーが出るんじゃないですかね? http://www.mathworks.co.jp/help/ja_JP/techdoc/ref/waterfall.html を見ると、 「X と Y がベクトルの場合、X は Z の列に対応し、Y はその行に対応します」 ってあるんで、これでいうとxとuの行数、tとuの行数が一致している必要がありますね。 x = -10: 10: 200 ; t = 0: 100: 50000000 ; とあるんで、xは22列、tは500001列ですね?ということはu側もそれと要素数が揃うように間引いてやればいいわけです。 u(行のインデックス,列のインデックス)とすればuの成分が取り出せるのはご存知ですね? インデックス指定にはベクトルも使用可能なので(行列は確か不可だった気がします)、 例えば u1=u(1:2:end,1:2:end)とすれば、uの奇数行と奇数列だけを取り出すことができます。 あとは、tとxに上手いこと合わせられるように、インデックス指定のベクトルを作ってやって下さい。 ただし、当たり前ですがインデックスには0以下の数を与えることはできませんし、小数も不可です。 200列から22列だけ取り出したり、50000000行から500001行取り出したりするのは難しそう(等間隔に取りにくい)ですが、 そこはまあ頑張ってください。 不明な点等あれば補足いただければと思います。 参考になれば幸いです。

hyenaydtekie
質問者

補足

ご指導ありがとうございます. 上述の細くのように, u1=u(1:2:end,1:2:end) を参考に, 行をステップ数100,列をステップ数10で, waterfall(u(1 :50000000/100 :50000000, 1 :200/10 :200)); とし、 プロットできたんですけど、 x,yの座標の両端が、行列の番号がそのまま出力されてしまいます。 x軸の末端の値を-10,10 y軸の末端の値を0,30 ってしたいんですけど、 xlimやylimを使っても上手く逝かないし、 x = linspace( -20, 20, 200 ); t = linspace( 0, 50000000, 100 ); waterfall(x,t,u(1:100:end,1:end)); とやっても CAT arguments dimensions are not consistent. って出ます。 何か成す術はないものでしょうか・・?

関連するQ&A