• ベストアンサー

関数を使った配列計算

関数を用いて配列を使った行列の演算(入力された行列の行列式、転置行列、逆行列)をするプログラムを見やすくしたいのですが、配列を関数に渡すやり方がわかりません。 出来れば実際のプログラムで教えてもらいたいです。よろしくお願いします。

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

  • ベストアンサー
回答No.1

C言語の場合ですが、 void test(int a[10]) { a[0] = 10; } int main(void) { int a[10]; test(a); } ↑このような記述で配列を関数に渡すことが出来ます。 関数test内で書き換えた配列はmainでも反映されてます。

関連するQ&A

  • 多次元配列の行列

    1番 キーボードから3×3の行列の要素を2次元配列に入力した後、その値を表示するプログラムをさくせいせよ 2番 キーボードから3×4の行列の要素を2次元配列に入力した後、転置行列を出力するプログラムをさくせいせよ 3番 2つの行列A(3×3行列)、B(3×3行列)の買う要素の値をキーボードから2つの配列に入力し、2つの行列、並びに、それらの和、差、積の行列を出力するプログラムを作成せよ(Bに単位行列を入れて検算せよ) 4番 2行3列の行列と3行2列の積を求めるプログラムを作成せよ どなたかわからないでしょうか?? 数が多くてすみません。 わかる方お願いします!!

  • エクセルでの行列計算がうまくいきません

    よろしくお願いします。 いまエクセルで行列計算をしています。 行列[108(行)×35(列)]とその転置行列[35×108]の積から行列[108×108]を出そうとしているのですがうまくいきません。 #valueエラーがでます。 関数mmultを使用しています。 転置行列は関数transposeを使いました。 [35×108]・[108×35]=[35×35]ではちゃんとでるのですが、108×108ではだめなので、元データには問題はないと思います。 一体何がエラーの原因として考えられるのでしょうか。 よろしくお願いします。

  • 入力関数(配列4個)を作成するプログラムです。

    入力関数(配列4個)を作成するプログラムです。 内に入れる数字は、0~9です。どうしてもイメージがわからず 困っています。どなたかご教示頂けましたら大変助かります。 どうか宜しくお願い致します。

  • 配列を戻り値にして逆行列を求める関数

    #include(stdio.h) int main(){ double a[4][4]={{1,2,0,-1},{-1,1,2,0},{2,0,1,1},{1,-2,-1,1}}; //入力用の配列 double inv_a[4][4]; //ここに逆行列が入る double buf; //一時的なデータを蓄える int i,j,k; //カウンタ int n=4; //配列の次数 //単位行列を作る for(i=0;i<n;i++){ for(j=0;j<n;j++){ inv_a[i][j]=(i==j)?1.0:0.0; } } //掃き出し法 for(i=0;i<n;i++){ buf=1/a[i][i]; for(j=0;j<n;j++){ a[i][j]*=buf; inv_a[i][j]*=buf; } for(j=0;j<n;j++){ if(i!=j){ buf=a[j][i]; for(k=0;k<n;k++){ a[j][k]-=a[i][k]*buf; inv_a[j][k]-=inv_a[i][k]*buf; } } } } //逆行列を出力 for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf(" %f",inv_a[i][j]); } printf("\n"); } } という、4次元正方行列の逆行列を求めるプログラムがあるのですが これを複数の行列の逆行列が求められる関数にする場合を教えてください・・行列は配列で作ってるのでよくわかりません、お願いします

  • 関数呼び出しを制御する関数について

    条件によって異なる関数を呼び出す関数を作成するときに幾つかの疑問を感じました。 例えば、ボタンを入力することによってmake_textbox()という関数(新たなテキストボックスを表示する因数なし戻り値なしの関数)を呼び出したときに、その関数を呼び出す前にグローバル関数の設定を行いたくなって function complex(){    ///新たな関数 x = $('form1'),value; /// グローバル変数の設定($ ← は prototype.jsによる)(form1の値をとる)   make_textbox(); } といったcomplex()関数を作ったのですが、テキストボックスを作ってはくれませんでした。 また、 function make(){ make_textbox(); } といったmake_textboxを呼び出すだけの関数を呼び出してもテキストボックスは生成されませんでした。javascriptは引数を指定することなしにidを指定しさえすれば自由に、入力された値を操作できるので、引数なし戻り値なしの下のような関数を作ってみたのですが、実際これは的確に関数を呼び出せるのでしょうか? function f(){ if($('form1').value == 1){ f(); //例えばf()はテキストボックスに入力された値を配列に入れ替えたりする関数で g(); //g()はその配列で行列地を計算したりなど } h(); } また、もしお時間がございましたら、図々しいようですが下に提示するサンプルソースをご閲覧願います。もしご覧くださるのであれば、300行を超えるhtml&javascriptコード(ひとつ)なのでお時間をとってしまうことになりますから、「スクロールしてみても明らかに間違ってるよ」といえるような箇所をご指摘いただけたらあり難いです。サンプルソースは行列演算に関するもので、.txtファイルをダウンロードする形式になっております。 http://www1.axfc.net/uploader/Sc/so/183286 どうか、以上の私が抱いた疑問を解決して下さればあり難いです。

  • 行列の計算【配列 関数】

    行列式を計算する関数をもちいてプログラムを見やすくしたいのですが、何回やっても値の渡し方がわかりません。 他にも逆行列のプログラムなどの渡し方も知りたいです。 以下が時ビンで考えたプログラムです。 #include <stdio.h> double det(double array[3][3]); int main( void ) { int i,j,k,n=3; double array[3][3],d; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf( "A[%d,%d]=",i+1,j+1); scanf( "%lf",&array[ i ][ j ] ); } } printf("det= %f \n",det(array[][])); return 0; } double det(double array[][]) { double array[3][3]; d=array[0][0]*array[1][1]*array[2][2]; d+=array[1][0]*array[2][1]*array[0][2]; d+=array[2][0]*array[0][1]*array[1][2]; d-=array[2][0]*array[1][1]*array[0][2]; d-=array[1][0]*array[0][1]*array[2][2]; d-=array[0][0]*array[2][1]*array[1][2]; return d; } よろしくお願いします。

  • 引数になっている二次元配列の大きさを知る

    行列の掛け算をする関数で Matrix(int a[2][2], int b[2][2], int result[2][2]) のようにすると[3][3]用、[4][4]用、・・・と似たようなプログラムをいっぱい作る羽目になる。 Matrix(int *a, int *b, int *result) のようにすると*aから配列の大きさがわかれば その大きさ/4の平方根をとってnとでればn×n行列とわかって解決と考えましたが、*aから配列の大きさをわかるにはどうしたらいいですか?

  • Excelには行列計算関数はないの?

    Excel97 で行列計算をしようと思っていましたがそれらしい関数が見当たりません 2つの行列の加減乗や逆行列や行列式を求めるようなルーチン処理を 自分で記載しないと行けないのでしょうか? よろしくお願いします

  • 関数の配列はできないでしょうか。

    ひとつの関数で、出力を配列のように複数させたいのですが、できないでしょうか。

  • 二次元配列を引数として渡し、再び返す方法

    c++を用いてます。 main関数内において、二次元配列(行列)の計算によって各成分の値を求め、 その二次元配列を関数の引数として渡し、成分を用いて計算した後、再び返す方法を知りたいです。 具体的には、ルンゲクッタ法を用いたプログラムで、 #include<iostream> : double g11(double D[][9],double x11~) double g12(double D[][9],double x11~) : int main(void) { (中略)double D[6][9]=などの定義をしています for(i=0;i<100;i+) { 行列の計算(積や逆行列の計算) ルンゲクッタ法 (ここでg11を用います) k111=h*g11(D,x11,…); : dx11=(k111+…)/6.0; : cout<<x11…<<endl; x11+=dx11; x12+=dx12; : } return 0; } double g11 (double D[][9],double x11…) { double dif; dif=D[0][0]*x11+D[0][1]*x12+…   return(dif); } double g12 (double D[][9],double x11…) { double dif; dif=D[1][0]*x11+D[1][1]*x12+…   return(dif); } : というようなプログラムです。エラーは出ないのですが、値が一瞬で発散してします。 ちなみに、D[6][9]は行列の積や逆行列の計算を行った結果得られた二次元配列です。 おそらくポインタをうまく使わないといけないことはなんとなく解るのですが…。 プログラムの説明が解りにくくて申し訳ないのですが、よろしくお願いいたします。

専門家に質問してみよう