• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:matirix market データ読み込み方法は?)

matirix market データ読み込み方法は?

このQ&Aのポイント
  • MATRIX MARKETで行列データを取得してC言語で読み込む方法について知りたいです。
  • 連立一次方程式の解法の研究のために、MATRIX MARKETの行列データをC言語で読み込もうとしていますが、上手くいきません。
  • 非ゼロ要素のみが記述されている.mtxファイルを読み込む方法について教えてください。

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

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

こんばんは. 「何をしたいのか」について補足をお願いします. >コマンドプロンプトに読み込んだデータを出力することはできるのですが、配列に格納… この仰りようが既に矛盾しているということにお気づきでしょうか? 私が触ったのは結構前ですが,そのときからコードの内容が変わったのかと思い, 現在のコードを入手し,手元で再び実行してみました. 与えたデータファイルは http://math.nist.gov/MatrixMarket/data/NEP/tubular/tub100.html です. 結果,正しく標準出力にデータが出力されました. これはexample_read.cの実行結果です. つまり,この時点で「配列I,J,valにデータは格納されています」. フォーマットを何か別の型式に変更したいということでしょうか? それとも「example_read.cはコンパイルできたのだが,自分のコードはうまく行かない」ということでしょうか? 後者であればmatrix market云々ではなく,単純に質問者様の実装が不適切なだけ, C言語そのものについて知識が不足しているということになります. とりあえず, fscanf(fp,"%d %d %d ",&a[i],&col_ind[i],&val[i]); の部分は書式指定が不適切なのでこのままではデータを正しく読めません. 勝手に変更したりせずにサンプルコードをそのまま使えば良いのでは?

toshikou77
質問者

お礼

再度のご回答ありがとうございます。 結局、example_read.cにおいて既に配列に格納されていることに恥ずかしながら気付いていませんでした。。 回答者様のご指摘のとおり、C言語についてはまだまだ知識足らずで、自分で上記のコードで読み込もうとしていました。 丁寧に教えていただきありがとうございました。 無事、したいことができました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

こんばんは. ちょっと触ったことがある程度ですが… matrix marketに読込の為のソースコード(参考URL)がありますよ. ヘッダの解析等一通りできるはずです. まぁ,私は「非零要素が何の順番で並んでいるか」 が分からなかったので読み込んだ後ソートして使ってましたが. こんなことをしていたのは「行列の乗算」を「転置行列の乗算」きちんと行いたかったためです.

参考URL:
http://math.nist.gov/MatrixMarket/mmio-c.html
toshikou77
質問者

お礼

ご回答ありがとうございます。 おっしゃるとおり、そのソースコードを使ってみたのですが、うまくいかないのです。コマンドプロンプトに読み込んだデータを出力することはできるのですが、配列に格納、もしくは、別ファイルに出力することができません。 読み込みには、 fp=fopen("tub100.mtx","r") while( 1) {   fscanf(fp,"%d %d %d ",&a[i],&col_ind[i],&val[i]);   if( feof(fp)) break;   i++; } という感じで配列に格納しようとしています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++の連立方程式のプログラム

    3元3列の連立方程式の係数を格納し、格納されて結果を表示するプログラムを表示せよ。ただし以下の2通りで行う事 係数を『初期化』を使って配列に入力する キーボードから入れる 上に書いたやつを参考にできると思って載せたんですが、分かる人いますか? 問題の意味って 連立方程式の係数を入力して(9つの係数)それを3*3のマトリックスで出すってだけで解くわけじゃないんですかね?どこにも連立方程式を解くって書いてないわけだし。 つまり 『1つ目の係数を入力せよ 2 2つめの係数を入力せよ 3 … 9つ目の係数を入力せよ 9 2 3 4 8 8 0 4 5 9』 みたいな ヒントの所には、 3*3のマトリックス作って初期化を自分で行う っていうのと 連立方程式の形が書いてありますが a00x+a01y+a02z=α a10x+a11y+a12z=β a20x+a21y+a22z=γ そして、とりあえず、3*3行列はこれで出来ました。 #include <iostream> using namespace std; int main() { int i,j; int vector[]={10,20,30,40}; int matrix[][3] = {{1,2,3},{4,5,6},{7,8,9}}; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout << matrix[i][j] << ' '; } cout << '\n'; } return 0; } しかし、問題の連立方程式の係数を格納とかキーボードから入力ができないんですよね 多分上に書いたプログラムくらいのレベルだからそんなに複雑にならないはずなんですが

  • 連立方程式について

    連立方程式の解法っていろいろありますよね。 加減法、代入法、行列を用いた掃きだし法以外でしゅうれん法(?)っていうのを聞いたんですが、どなたかこの解法について知っている方いらっしゃいましたら回答お願いします。

  • 連立一次方程式を解くプログラムについて

    数値計算の本を見たら必ず載っている連立1次方程式の解法ですが、どのようなタイプの行列でも解くことができるものにはどのような解法があるでしょうか。もちろん、解くことができる範囲でということではあります。その意味でガウスの消去法(ピボット付)になるでしょうか。ガウスの消去法は解き方に基本的な制約はないですね。一方、共役勾配法の説明を見ると"対称正定値行列の場合、..."となっており、その範囲でしか考えていないということでしょうか。そうなるとかなり絞られることになってしまいます。任意の行列は変換して対称正定値に変換できる、ということでもないと思いますが。 有限要素法に関連した連立方程式解法についても書籍1冊分の解説とかありそうですが。高速化のために長い解説があったとしても前提によって使える範囲が狭いものが多いように思えるのですが。よろしくお願いします。

  • 数学の参考書を探しています。

    いま、理工系の学部に進学し勉強をしているのですが… それで…なぜか今の数学の先生は指示する参考書(教科書)がなく…教科書なしで授業を進め…チンプンカンプンです。 そこで、参考書を自分で買おうと思うのですが…このシラバスからいくとどういう参考書がお勧めですか??お願いします。 連立線型微分方程式とは 行列の指数関数 行列の対角化 対角化による連立線型微分方程式の解法 射影 行列のスペクトル分解 スペクトル分解による連立線型微分方程式の解法 多変数関数の微分可能性 全微分と偏微分 多変数関数の微分計算 陰関数 多変数関数の極値

  • 非正方行列でのクラメルの公式

    非正方行列(nxn正方行列ではない場合)の連立1次方程式の解をクラメルの公式を用いて解く場合は、正しくはどうすればよいのですか? 例えば下の問題の解法です。 ----------------------------------------------------------- 2X + 2Y = 1 X - 4Y = -1 X + 6Y = 2 4X - 6Y = -1 【正解: X = 1/5, Y = 3/10】 ----------------------------------------------------------- まず連立方程式の等号より前の部分(左辺)である | 2 2 | | 1 -4 | | 1 6 | | 4 -6 | これを転置行列で下のような2x2正方行列に直します。 | 22 -18 | |-18 92 | 次に連立方程式の等号より後ろの部分(右辺)である | 1 | |-1 | | 2 | |-1 | これを2行に直さなければいけないので、 | 2 1 1 4 | | 2 -4 6 -6 | と掛けて、 | -1 | | 24 | にしました。(ここが特に微妙です・・・これは正しい方法なのでしょうか?) これらを使って、クラメルの公式に当てはめると、 X = 1/1700 * A A = | -1 -18 | | 24 92 | すると、X = 1/5 Y = 1/1700 * B B = | 22 -1 | |-18 24 | すると、Y = 3/10 ----------------------------------------------------------- このように正解が導けました。しかし、このやり方は正しいのでしょうか? 手持ちの教科書には、nxn正方行列の方法しか載っていません。 どなたか教えて下さい。 よろしくお願いします。

  • 線形代数の問題です。困っています

    0...0...6 1...0..-11=Bの行列とする 0...1...6 (1)ψ(t)=det(tE-B)(Eは単位行列)とおく。ψ(t)=0の解を求めよ。それをα1、α2、α3とおく (2)(1)の各αiに対し、連立一次方程式(αiE-B)x=0の解で0と異なるものを一つとり、viとおく。v1,v2.v3は一次独立であることを示せ (3)R^3(座標空間)の一次変換T(x)=Axを考える。R^3の基底{v1,v2,v3}に関するTの表示行列を求めよ という問題です。 特に(2)、(3)の解法をよろしくおねがいします (1)は(α=1,2,3)となるのは解決済みです 至急でお願いします

  • 行列を用いて連立一次方程式を作る問題について

    解ベクトル(x e)を用いてこの国の為替市場が均衡する。この国の通貨に対する需要量(供給量)と為替レートを求めるための連立一次方程式を表記せよという問題があるのですが、この場合の係数行列は2×2ですか? 需要関数x=100-e 供給関数x=-300+5e という条件が与えられていて、 (1)でその連立一次方程式を表記する問題 (2)ではその求めた連立一次方程式とクラメールの公式を用いて均衡為替レートを求めよ、という問いになっています。 隠れた均衡式xd=xsを含めて考えて3×3の係数行列として計算するとちょうど綺麗な数字(100)が出てくるのですが、解ベクトル(x e)は2つしかありません。しかしそのまま二つの式だけで求めようとすると割り切れない値(-400÷-6)が出てきてしまいます。 これはきちんと係数行列をまとめる方法があるのでしょうか?それとも単純に自分のミスでしょうか・・?

  • 2次曲線の交点、一般の2元連立2次方程式の行列を使った解法?

    一般の2元連立2次方程式の解法(2つの2次曲線の交点)を考えています。ベズーの定理より解は4個あると思います。 a*x^2+2h*xy+b*y^2+2l*x+2m*y+c=0 A*x^2+2H*xy+B*y^2+2L*x+2M*y+C=0 一つのアイデアは、一方を標準形にした後、他方へ代入し、x(もしくはy)の4次方程式を作ることだと思います。 2次曲線を行列を使って書いたとき、2つを連立した (X^t)(A)(X)=0 (X^t)(B)(X)=0 という形のベクトルX^t=(x,y,1)に関する連立方程式を解くという方法はあるのでしょうか? また、極座標を使った解法やパラメーターを使った解法などはあるのでしょうか?

  • 行列の基底問題

    行列の基底、次元を求める問題で質問があります。 この問題の解法は階段行列を求めていくやり方と理解しているのですが、ひとつわからない点があります。 3次の連立方程式 x + 3y + 2z = 0 2x + y = 0 5y + 4z = 0 この基底、次元を求めよという問題で、階段行列変形した結果が 1 0 -2/5 0 1 4/5 0 0 0 このようになり、次元は1、基底は[-2/5 4/5 1]と考えたのですが、答えを見ると基底は[2/5 -4/5 1]となっておりました。 なぜこうなるかのご指導よろしくお願いします。

  • 連立方程式

    こんばんは。 本来はN元連立方程式を考えているのですが、ここでは5元連立方程式として質問させていただきます。 今、下記の5元の連立方程式を考えます。 u[0]-2*u[1]+u[2]=a u[1]-2*u[2]+u[3]=b u[2]-2*u[3]+u[4]=c u[3]-2*u[4]+u[5]=d u[4]-2*u[5]+u[6]=e (a~eは定数で、左辺はu"を差分表示したものです) これでは方程式の数が2つ少なくて解けないので、条件としてu[0]=u[5]、u[1]=u[6]とします。 上の条件を考慮して行列になおすと、 -2 1 0 0 1 1 -2 1 0 0 0 1 -2 1 0 0 0 1 -2 1 1 0 0 1 -2 となり、これをガウス・ジョルダン法で解こうと思っているのですが、行列式が0になってしまい解けません。つまりこの連立方程式は自明な解しか存在しないと言うことでしょうか?ガウス・ジョルダン法以外の別の解く方法か良いテクニックがありましたらアドバイスお願いします。 また分かりにくい場合は補足要求お願いいたします。