• ベストアンサー

行列の列の絶対値の総和の最大値を得る関数を教えてください

4*4行列の列ごとの各要素の絶対値の総和の最大値 課題の途中で上記の関数が作れないので止まりました・・・ 行列は2次元の配列で定義しているので 配列を引数にできるような関数を教えてくださいお願いします。

  • shunti
  • お礼率32% (123/381)

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

  • ベストアンサー
  • m0r1_2006
  • ベストアンサー率36% (169/464)
回答No.1

C++ なんかすごく久しぶりなので,for 文とかあってる自信ないけど, double ** で渡せばよい. 行列を, double M1[4][4]; に代入していたら,こんな関数を作って, norm1(M1); で渡す. double norm1(double **M) { double retu =0; for (int i=0; i<=3; i++) { retu += fabs(M[2][i]); % 3列?(行)の絶対値の和 } return retu; }

shunti
質問者

お礼

まとめてのお礼で失礼します #1さん、すいません、書き忘れましたがC++でなくCでした。まあ今回は違いはないですけど^^; #2さん 全部書いてくれてありがとうございます #3さん うまいことありがとうございました

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

今どきの C だと double maxcolsum(int n, double a[n][n]) { double smax=0; for (int i = 0; i < n; ++i) { double s = 0; for (int j = 0; j < n; ++j) { s += fabs(a[j][i]); } if (s > smax) { smax = s; } } return s; } のように書けるから非常に簡単.

回答No.2

配列のサイズが決まっているのなら、 func(int a[][4]) とか func(int a[4][4]) でいいと思います。 #include <stdio.h> #define abs(a) ((a)<0?-(a):(a)) /* 絶対値マクロ */ int cal_max(int a[4][4]) {  int i,j,max,sum[4];  /* 各列の絶対値和 */  for (i=0; i<4; i++) {   sum[i]=0;   for (j=0; j<4; j++) {    sum[i]+=abs(a[j][i]);   }  }  /* 最大値を探す */  max=sum[0];  for (i=1; i<4; i++) {   if (max<sum[i]) max=sum[i];  }  return max; } int main(void) {  int a[4][4]={{-2,-3,-4,-5},{-1,-2,-3,-4},{5,4,3,2},{1,2,3,4}};  printf("%d\n",cal_max(a));  return 0; } サイズ可変にしようとすると、ちょっと工夫が必要です。

関連するQ&A

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • 多次元配列の行列

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

  • 行列式のプログラム

    適当な形式にて初期化された2つの2次元配列により、3×4行列Aと4×3行列Bの要素を表現し、積ABを求めて表示させるプログラムなんです。 ここまでならなんとかなるかもと思ったんですが、行列はAはプログラム中で以下の数値で初期化して、行列Bの要素はキーボードから入力させるようにしないといけないんです。。   2.0 3.0 4.0 5.0 A= 3.0 4.0 5.0 6.0   1.0 2.0 3.0 4.0 なんですけれども、教えていただけたらうれしいです。。 お願いします!!

  • 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を指定しなければエラーになってしまいます。同じ関数名でも呼び方に応じて異なった操作をさせることはできないでしょうか?

  • PHP 多次元配列の次要素を返す便利関数

    PHP5を独学中の者です。 1次元や多次元配列を扱ってきて、次元数が決定されていない配列を自作関数に渡す事で、 現在のポイントの次要素を返す便利関数を考案中です。 【関数に求める利点】  ・引き渡した配列の次元数(1~n)に関わりなく、現在のポイントの次要素を返す。 【関数を使用した想定コード】   $e[0][0] = "a1";   $e[0][1] = "a2";   $e[0][2] = "a3"; // $e配列の次要素を取得 $r = 自作関数($e);  ※ 上記コードでは、現在のポイント($e[0][1])の次要素($e[0][2])を、$rに "a3" を返す   $e[0][0][0] = "a1";   $e[0][0][1] = "a2";   $e[0][0][2] = "a3"; // $e配列の次要素を取得 $r = 自作関数($e);  ※ 上記コードでは、現在のポイント($e[0][0][0])の次要素($e[0][0][1])を、$rに "a2" を返す 関数に対して引数を与えたり、色々と試行錯誤中ですが、アドバイス頂ければ嬉しいです。

    • 締切済み
    • PHP
  • 文字列を1つの要素とした配列を作る

    はじめまして、工学系の大学生です。C言語について質問です。 文字単体をデータとして配列を作るなら、例えば char [100]; で構わないと思うのですが、文字列を1つのデータとして配列を作る場合はどうしたらいいのでしょうか?僕が思いついたのは2次元配列を用いて1つの次元をデータ数、もう1つの次元を各データの最大文字数として例えば char name[100][20]; のように定義して、 name[0][]=David; name[1][]=Mathew; などととすれば、printf関数でname[0]を出力したらDavidが出てくれるかと思ったのですが、エラーがたくさん出てきてしまいました。 もしよろしければどなたか教えていただけないでしょうか?どうぞよろしくおねがいしますm(_ _)m

  • 二次元配列が、勝手に一次元配列になってしまう

    Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。

  • 関数で、最大値のあるセルの列を表示したい

    エクセルの関数について教えてください。 セルH1に関数を使って、列A、列C、列E、列Gの最大値を出しました。 その下のH2のセルに、関数を使って、列A、列C、列E、列Fの最大値のある列(A,B,C,Dのいずれか)を表記させたいのですが(下記のように)、可能でしょうか?   A B C D E F G H 1 10 ※ 28 ※ 66 ※ 26 99 2 56 ※ 29 ※ 89 ※ 28 A 3 99 ※ 12 ※ 66 ※ 10 (列Hが上記のようになるようにしたいのです。)

  • 初心者です。プログラミング 3×3行列の積

    先日、課題が出されて、1週間ほど考えてはみたのですがわからなかったため質問させていただきます。 3行3列の行列の積を求めるプログラムを作成しなさい。ただし、各行列要素は疑似乱数を使って値を求めるようにしなさい。また各行列要素は二桁以下の整数とし、行列の積を計算する部分を関数で行うようにしなさい。という問題なんですが、どなたかわかる方がいらっしゃいましたらご回答よろしくお願いいたします。できれば詳しく式などを書いていただきたいです。

  • 正定値行列の最大・最小

    正定値行列の最大・最小 行列の問題で以下の問題が分からないので、分かる方はヒントをいただければと思います。 一応画像を張っておきますが(張れてないかも・・・)見えにくい(見えない)場合は、下に同じ表現の文章を書いていますので下の文章を見てください。 Aをp次対称行列,bをp次元ベクトルとす。このときfを f(x1,x2,・・・,xp) = x^tAx + (b,x) (-∞<xi<+∞) と、定義する。 (1)Aが正定値行列であるとき、fの最大値、最小値を求めよ。 (2)Aが非不正定値行列でbがM(A)の元でないとき、fの最大・最小を求めよ。ただしM(A)は行列Aの縦ベクトルが張る線形部分空間を表す。 初めのfの定義でのx^tはxの転置行列、(b、x)はbとxの内積を表しています。 よろしくお願いします。

専門家に質問してみよう