• ベストアンサー

matlabにおける行列の格納

matlabにおける質問です。 (matlabもとよりプラグラミング初心者です。) 例えばx=[1 2 3;3 4 5]となっているとき for i=1:10 y(1)=i*x end のように、しても、y(1)とxの次元が合わないというエラーが 出ると思います 行列を、このように「i番目」といった添え字のついた変数に 代入するには、どうしたらよいのでしょうか。 初心者のため大変初歩的なことですが、どなたかご教授ください。 とても焦っております。。。

  • uni7
  • お礼率86% (20/23)
  • 科学
  • 回答数5
  • ありがとう数4

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

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

そうですね… そもそもy(1)とかy(2)というものには値が1つしか入らないので、 そこに行列を入れることはできないですよね。 他の方が書かれているように、多次元配列で解決する、というのが1つの手だと思います。 もう1つの手としては、セル配列を使うというものがあるでしょう。 セル配列は、言うなれば変数の「入れ物」からなる配列です。(変数の名前は保持されません) ですので、それぞれの配列に行列を入れることもできますし、 ある入れものには数値の行列を入れて、別の入れ物には文字列を入れて、なんてこともできますし、 入れ物の中に入れ物を入れることもできます(セル配列の1つの要素をセルにする) ということで、 y=cell(10,1); for i=1:10 y{i}=i*x; end とすることで1つのセル配列に全ての行列を入れることができます。 ただ、セル配列はそのあとの計算が面倒になるかも知れません。 例えば、多次元配列ならその全ての要素に1を足す、とか2倍する、という操作は簡単にできます(多分)が、 セル配列の場合は1つ1つのセルに対して操作してやる必要があります。 以上、参考になれば幸いです。

uni7
質問者

お礼

御礼が物凄く遅くなって申し訳ございません。 皆様にご回答いただく度にとても感謝していたのですが、 焦りすぎていて、御礼をするのを先延ばしにしてしまった結果 今更・・・という形になってしまいました。 心よりお詫び申し上げます。 ご親切にお答えくださって、本当にありがとうございました。

その他の回答 (4)

  • masudaya
  • ベストアンサー率47% (250/524)
回答No.5

yをもう一つ次元を上げて3次元の行列にすればよいかと思います. x=[1 2 3;3 4 5]; [xsize,ysize]=size(x); y=zeros(xsize,ysize,10); for i=1:10 y(:,:,i)=i*x; end つまり,最初の添え字は,行列をして,最後の行列は 番号を指定するような感じになります. 一応2009bですが動作は確認しました.

uni7
質問者

お礼

御礼が物凄く遅くなって申し訳ございません。 皆様にご回答いただく度にとても感謝していたのですが、 焦りすぎていて、御礼をするのを先延ばしにしてしまった結果 今更・・・という形になってしまいました。 心よりお詫び申し上げます。 ご親切にお答えくださって、本当にありがとうございました。 (ベストアンサーとさせていただけなく、申し訳ございません。 一つしか選べないのが心苦しいです。)

  • my3027
  • ベストアンサー率33% (495/1499)
回答No.3

多次元配列です。参考に。

参考URL:
http://www.mathworks.co.jp/help/ja_JP/techdoc/math/f1-86528.html
uni7
質問者

お礼

御礼が物凄く遅くなって申し訳ございません。 皆様にご回答いただく度にとても感謝していたのですが、 焦りすぎていて、御礼をするのを先延ばしにしてしまった結果 今更・・・という形になってしまいました。 心よりお詫び申し上げます。 ご親切にお答えくださって、本当にありがとうございました。

  • my3027
  • ベストアンサー率33% (495/1499)
回答No.2

>「添え字でy(1),y(2),y(3)、、、というように順々にyに異なる行列を格納していきたいが、y(i)では行列と次元が異なり不適切なのでどのようにyに添え字をつければ行列を格納できるのでしょうか」 ということです。文章がわかりにくく申し訳ございません。 少し分かりましたが、y行列のサイズがわかりません?もしxより大きければ、それをy内にどう配置するかというプログラミングになりますが、もしyがxと同じサイズで複数必要であれば3次元行列という方法を使わないといけません。y(i,j,k)のkでk種類のy行列が作れます。 >(matlabではあまりfor文を使わないほうがいいようなことを聞いたのですが、この場合for文を使わないとどうなるでしょうか。) 別にforを使って問題ないと思います。for使わないとwhileとかifで代用しますが、余計分かりにくくなると思います。

uni7
質問者

お礼

御礼が物凄く遅くなって申し訳ございません。 my3027さんは3回もご返答くださったのですよね。 本当にありがとうございました。 皆様にご回答いただく度にとても感謝していたのですが、 焦りすぎていて、御礼をするのを先延ばしにしてしまった結果 今更・・・という形になってしまいました。 心よりお詫び申し上げます。 ご親切にお答えくださって、本当にありがとうございました。 (ベストアンサーとさせていただけなく、申し訳ございません。 一つしか選べないのが心苦しいです。)

  • my3027
  • ベストアンサー率33% (495/1499)
回答No.1

xは3X3の正方行列ですか? >行列を、このように「i番目」といった添え字のついた変数に代入するには、どうしたらよいのでしょうか。 この文の意味が不明です。「i番目」といった添え字のついた変数とは何ですか? ちなみにプログラムだと、3X3の正方行列にiという整数(1~10)をかけて行列yに格納したいように読めます(y(1)は間違いですが)。その意図であってますか?

uni7
質問者

補足

xは2行3列です(xの大きさはなんでもかまわないのですが)。 おっしゃる通り、y(1)は間違いでy(i)と打ったつもりでおりました。 その意図であっております。 すなわち、 「添え字でy(1),y(2),y(3)、、、というように 順々にyに異なる行列を格納していきたいが、 y(i)では行列と次元が異なり不適切なので どのようにyに添え字をつければ行列を格納できるのでしょうか」 ということです。 文章がわかりにくく申し訳ございません。 (matlabではあまりfor文を使わないほうがいいようなことを 聞いたのですが、この場合for文を使わないとどうなるでしょうか。)

関連するQ&A

  • MATLAB 行列の抽出

    私はMATLAB初心者なのですが,行列の抽出ができなくて困っております. やりたいこととしては,for文を用いて行列x_r(41×3行列)がode45によって次々と求められるので,そのつどそのつど(i=1のときから1=10のときまで)でx_r(1)の値を新しい行列pに保存していきたいのですが上手くいきません.わかる方がいらっしゃいましたらご教授お願いします. for i=1:10 [t,x_r]=ode45('...',[0.01],x_r); ..... p(:,i)=x_r(:,1); …(1) ..... end 上の(1)のように行列pにi=1~10までのときのそれぞれのx(i)(41×1行列)の値を保存しようとしましたがうまくいきません. p=(x(1)_i=1,x(1)_i=2,x(1)_i=3,・・・・,x(1)_i=10) (41×10行列)(やりたいことのイメージ) エラーメッセージは「添字による代入の次元が一致しません。」と出ています.

  • MATLABのシンボリックの係数行列の順序について

    現在MATLABについて勉強しているのですが、y=3*x^2+4*x+2のような任意の1変数多項式において、 最高次の係数で規格化(y=3/3x^2+4/3*x+2/3)したく、cf=coeffs(y)で係数の行列([2 4 3])を返し、 最高次の係数の要素(cf(end))で、多項式を割った式(y/cf(end))を求めたのですが、 上記のように係数の行列要素が次数の低い順にいつでもなっていると最高次の係数の要素はcf(end)で良いのですが、 与える多項式によって、係数行列要素の順序が変わってしまいます([2 3 4]、[3 4 2]のように)。 任意の1次多項式において規格化できるようにしたいのです。 どなたか初心者でも理解できるようご教授お願い致します。

  • MATLAB ヤコビアン行列 変数の指定

    MATLABでヤコビアン行列を求めるプログラムを組みたいのですが、MATLAB初心者のため、どうしても変数を指定するところから先に進むことができません。 変数V(1)…V(10)、Y(1,1)…Y(10,10)には、本当は数値を入れたいのですが、シンボリック式でないとヤコビアン行列は扱えないようなので、symsで上の変数をシンボリック化したいと思っています。 上のように…と省略しているように、変数を指定する際、V(1)…V(10)の10個とY(1,1)…Y(10,10)の10×10=100個を羅列せずに省略して書く方法はありませんか? どなたか分かる方よろしくお願い致します。

  • matlab matファイルから一部だけを読み込む

    Matlab初心者です、よろしくお願いします。 Matlabでn×m行列のデータが入っているmatファイルからx×y行列のデータを変数に読み込みたいのですが、どうすれば良いのでしょうか? ご教授していただけると助かります。 よろしくお願いします。

  • MATLABで行列を配列に格納する方法

    MATLAB初心者で大変申し訳ありませんが、行列の格納の仕方がわからないので、投稿させていただきました。 for k = 1:1:10 k=k; t(:,:)=load(sprintf('test%5.5i.txt',k)); end 具体的に言いますと、上記のプログラムで、test00001~test00010.txtというファイルを任意の行列t(:,:)で読み込んでいるのですが、このt(:,:)をkと対応させて、例えばk=1の場合のtをt[1]、k=2の場合のtをt[2]などの配列に格納し、それを自由に呼び出し、計算を行いたいと考えております。 基礎がわかっていないためにどうしていいかわかりません。 宜しく御願いします。

  • MATLAB

    matlabで for x=1:10 for y=1:10 for z=1:10 f=2*x+3*y-4*z; end end end のようなプログラムで、最大のときのfの値と、そのときのx,y,zの値を表示させるにはどのように書けばいいでしょうか?

  • Matlabで自作関数をオーバーロード

    Matlabの組み込み関数の中には、引数の数や戻り値の数に応じて異なる作用をするものが沢山あると思います。 例えば組み込みのmax関数だと y=max(x) ならxの第一次元にについての最大値を返しますし、 [y,i]=max(x) なら、さらに i に最大値のindexを代入、 一方 x=max(x,y) ならx,yの各要素について大きい方を取った行列を、 x=max(x,[],d) ならxのd次元についての最大化をしてくれます。 質問ですが、そういう関数を自分で作ることは可能ですか? function [z,w]=f(x,y) という風に関数を定義してしまうと、たとえyを関数中で利用しない場合でも、引数yを指定しなければエラーになってしまいます。同じ関数名でも呼び方に応じて異なった操作をさせることはできないでしょうか?

  • MATLABとC++

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

  • MATLABでの行列の全要素の和

    MATLABでの行列の全要素の和を計算するのに下の例のようにfor文を使うのとsum関数を使うのとで結果が違います。何故ですか? 計算結果の差をとってみると極々微小な差が生じてしまいます(e-10位)。 シミュレーションの中でこのような処理を行っているのでより正確な方が知りたいです。 例 A=rand(10); plus=0; sum=0; for i=1:10  for j=1:10   plus=plus+A(i,j);  end end sum=sum(A(:));

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

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