• 締切済み

MATLABプログラミングをCのプログラミングに変換

MATLABでよくやる以下のプログラミング方法を効率よくCでプログラムするにはどうすべきですか? a=[]; for i = 1:100 a_k = [1 2 3 4];<<-a_kは1行4列の行列です a = [a a_k];<<-特にこの部分 end よろしくお願いします。

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

#2ぼけぼけ。 for i=1:100  s = 1 + N*(i-1);  e = s + N-1;  a(s:e) = a_k; end こんな感じかな。 あ、MATLABでiは確か虚数を表すから使わないほうが良かった気もする。 うろ覚え。

bonzomania
質問者

お礼

なるほど、ありがとうございます。 MATLABでもCでも試してみます。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

これは、MATLABでもよくないプログラムです。 MATLABのエディタのコードアドバイザみたいなのが、 「ループ内で変数aが増加する可能性があります。メモリの事前割り当てを検討して下さい」 というような警告を発しているでしょう? 実行パフォーマンスも最悪のはずです。 したがって、MATLABでもCでも、 「ループ回数から使用するメモリ量を事前に算出し、  メモリの事前割り当てを行ってからプログラミングをする」 ことが、最も効率が良いプログラムです。 MATLABなら、 N = length(a_k); a = zeros(N*100); for i=1:100 a(k:k+N-1) = a_k; end とか。まあ、この程度ならrepmatの1文で作ってしまえますが。 Cも同様。メモリを確保して、for文でindex計算をして代入する。

回答No.1

リスト構造にすればよいのでは?

関連するQ&A

  • MATLABのデータ抽出についておたずねしたいことがあります。

    MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

  • matlabにおいて、

    matlabにおいて、 [(-Q*A) (Q*A) (-Q*A^2) (Q*A^2) ....(Q*A^29)]のような行列を、 for i = 1:29 のみたいな感じのもので表現できますでしょうか。 それかほかにもっといい表現の仕方はありますか? ちなみにQもAも2行2列の行列です。

  • MATLABにおける行の挿入方法

    こんにちは,現在データ整理のためにMATLABを用いて以下のようなプログラムを構築しています 1.ファイルを読み,その値を100行7列の行列Aとする 2.Aの10行目と11行目の間に1行7列の行列B1を挿入する (イメージ的にはEXCELの行の挿入です) 3.同様に20行目と21行目の間に1行7列の行列B2を挿入する 4.以降10行ごとに繰り返す となります.ここで2の処理にあたる「行列の特定の列の間に別の行列を挿入する」方法がわかりません いろいろ調べたのですが、このような方法はどこにもありませんでした MATLABに詳しい方,教えていただけないでしょうか?

  • C言語→MATLABへの変換で、困っています。

    学生研究でMATLABを使用しています。 光学測定系で画像を取り込み、それを解析する実験を行っています。 MATLABはプログラム内の値の変更や処理の追加できることから 大変助かっています。 そこで、もともとはC言語でやっていた3種類の処理を 一つのMファイルで行いたいと思い。 只今、C→MATLAB変換するプログラムの書き直しを行っています。 そのうち2種のプログラムは行列の計算がメインだったため何とか Mファイルに書き直すことができたのですが、 最後のひとつが難しい関数らしきものが多く、 MATLABに書き直すことができるプログラムなのかもわからない状態です。 そこで、 ・C→MATLAB変換可能なプログラムか? ・書き直すにあたってどこを部分を直せばよいのか? をアドバイスいただけないでしょうか? ↓MATLAB化したいC言語ファイル http://karispace.web.fc2.com/cmat2.c 一枚のbmp画像から4枚のdatデータを出力するプログラムです。 C言語とMATLABの三ヶ月前に勉強して、使用しており、基礎がわかる程度です。 よろしくお願いします。

  • MATLABとC++

    こんにちわ。資料を参考にしつつMATLABからC言語へ変換する作業をしているのですが、どちらに関しても初心者レベルで遅々としてはかどりません…。 分からないことの一つとして、MATLABは行列計算がしやすいがC言語はそうではないということからなのですが、MATLABで A = zeros(10,20,30) というのは次元10×20×30をもつゼロ行列 ということは分かったのですが、これは 数学で習う行列、2×2 や3×3など二次元な数字の並びを、三次元にまで拡張した表し方ということでしょうか?? また、上の式をC言語で書き表すとすると どのように書き表せるのでしょうか?どなたか分かるかた 教えていただければと思います。

  • matlabについて教えてください

    プログラミング初心者です。matlabについて教えてください いまmatlabのプログラム上に、x, y, z, という、それぞれ5行1列の変数があります。 これらをまとめて、linuxのテキストエディタ(geditなど)で読み込める1つのファイルを作りたいと思っています。 作りたいファイルは、1列目にx、2列目にy、3列目にz の値が並んでいるような感じです。 どうかやり方を教えて下さいますようお願いします。

  • MATLAB 並び替え

    MATLABについての質問です。 いま、以下のような行例A(2*2)があります 1 0.24 1 0.44 1 0.67 2 4.69 2 9.40 3 6.4 3 6.66 3 5.67 3 3.98 3 9.92 4 1.43 ...続く 即ち、行列Aは一列目に整数のインデックス1~100、2列目にあるデータが格納されています。これを、新しい行列Bに並び替えたいのです。行列Bは行方向にデータ、列方向にAの一列目のインデックス、という風にしたいです。具体的には、 0.24  4.69  6.4  1.43 0.44   9.40   6.66 0.67      5.67          3.98          9.92 です。どのように書けばもっともシンプルでしょうか? 質問の仕方が悪かったらごめんなさい。どうぞよろしくお願いいたします。

  • c言語 行列の積に関して

    <問>  4行3列の行列aと3行4列の行列bの積を、4行4列の行列cに格納する関数を作成せよ。  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) 入門レベルのスキルしかありません。 上手く行列の積のプログラムが組めません。 行列の積の計算結果が何も出てきません。 どの様にしたら良いかご指導の程、宜しくお願いします。 <プログラム>  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) { int i, j, k; for (i = 0; i < 4; k++) { for (j = 0; j < 4; i++) for (k = 0; k < 3; j++) c[i][j] = c[i][j] + (a[i][k] * b[k][j]); } } void mat_print(const int m[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) printf("%4d", m[i][j]); putchar('\n'); } } int main(void) { int i, j ,k; int tensu1[4][3]; int tensu2[3][4]; int seki[4][4]; for(i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { scanf("%d", &tensu1[i][j]); } putchar('\n'); } for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++){ scanf("%d", &tensu2[i][j]); } putchar('\n'); } putchar('\n'); mat_mul(tensu1, tensu2, seki); puts("行列の積"); mat_print(seki); return 0; }  

  • matlabで複数条件のif文を行列計算で行うには?

    matlabで複数条件のif文を行列計算で行うには? matlabではfor文などは行列計算で回したほうが高速化できると聞きました。 for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか? 自分のプログラムは以下のようなものです for i=1:100 for j=1:100 theta_kari=atan(abs(B(j,i))/abs(A(j,i))); if A(j,i)>=0&&B(j,i)>=0 theta(j,i)=theta_kari; elseif A(j,i)<0&&B(j,i)>=0 theta(j,i)=theta_kari+(pi/2); elseif A(j,i)<0&&B(j,i)<0 theta(j,i)=theta_kari+pi; elseif A(j,i)>=0&&B(j,i)<0 theta(j,i)=theta_kari+(pi/2*3); end end end よろしくお願いします

  • MATLABのプログラミングで

    MATLABでプログラミングを行っているのですが、forを使い for trt=1:rety(1); xt2(trt,:)=xt1(trt):xt1(trt)+(x-1); yt2(trt,:)=yt1(trt):yt1(trt)+(x-1); end for t3t=1:re/ysuu torie(:,:,t33(:,t3t))=saweq(xt2(gjir1(trt),:),yt2(gjir1(trt),:),:); end この様な変数を作製しています。 上のアルゴリズムは a:b (a=1:10) (b=a+5) で複数の位置データを記録する物で、 下のアルゴリズムは画像データを重ね合わせる物です。 これらのアルゴリズムでforを使わずにより高速化できる方法があれば連絡をお願いします。