• ベストアンサー

行列転置データのファイル変換方法

200行4000列の数値データの情報処理を行うのですが、 このデータをEXCELファイルとして、4000行200列のデータの形として保管しています。EXCELは255列までしか扱えないので、これを転置することはできません。そこで、例えば、SASやSPSS、SYSTATなどの統計ソフトで処理できるよう、行列を転置して、これらのソフトに読込めるように、ファイル変換をする方法を探しています。  どなたか、教えて!

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

  • ベストアンサー
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

手作業チックな方が、 意外とうまくいきますよ Sub transpose() Dim intFileNo As Integer Dim lngRow As Long Dim lngCol As Long Dim strWork As String intFileNo = FreeFile() Open "outtrans.csv" For Output Access Write As intFileNo For lngCol = 1 To 200 strWork = "" For lngRow = 1 To 4000 strWork = strWork & Cells(lngRow, lngCol).Value If lngRow < 4000 Then strWork = strWork & "," End If Next Print #intFileNo, strWork Next Close #intFileNo End Sub こんなかんじで。 これで読み込めなかったら、 読み込む側の最大行数 以上だったということです。

その他の回答 (1)

noname#11856
noname#11856
回答No.1

CSVに吐き出す。 ただし、メニューから名前を付けて保存などでCSVにしても 行列入れ替えが出来ないので、VBAで出力するようにする。 Dim intFileNo As Integer Dim lngRow As Long Dim lngCol As Long intFileNo = FreeFile() Open "保存ファイル名" For Output Access Write As intFileNo For lngCol = 1 To 200 For lngRow = 1 To 4000 Write #intFileNo, Cells(lngRow, lngCol) Next Write #intFileNo, vbCrLf Next Close #テキストベースで書いただけでテストしてないのでミスあるかも(^-^;

ronyasu
質問者

お礼

色々教えてもらい、助かりました。もう少しうまくいかないのですが、何とかやってみようと思っています。

ronyasu
質問者

補足

決定的な対策のように感じました。 excelのマクロを早速作ってみました。うまく作動 して、outtrans.csvやouttrans.sysのファイルを作成できましたが、うまく、読み込めませんでした? ファイルの属性の指定に、もっと詳細な情報が あるのでしょうか? ---------------- Sub transpose() Dim intFileNo As Integer Dim lngRow As Long Dim lngCol As Long intFileNo = FreeFile() Open "outtrans.csv" For Output Access Write As intFileNo For lngCol = 1 To 200 For lngRow = 1 To 4000 Write #intFileNo, Cells(lngRow, lngCol) Next Write #intFileNo, vbCrLf Next Close End Sub

関連するQ&A

  • ある行列とその転置行列の積の逆行列は?

    今エクセルで行列を使って問題を解いています。 問題は 行列X、A、Yがあり、Xは1行4列、Aは1行2列、Yは1行4列です。 X・A=Y という式があり、Aの行列は未知数a,bの要素からなっています。 X,Yはそれぞれ数値として要素が決まっています。 ここからはヒントとして表示されていました。 そこでXの逆行列を両辺の左からかけるとAは求まるはずですが、 Xは正方行列ではないので、Xの転置行列を左からかけます。 X(T)・Xは正方行列になるのでこれを行列Pとおくと Pの逆行列を求められ、右辺にP^-1をかけるとAが求まる。 というものです。 エクセルで書かれている通りにやってみて、エラーになるので調べてみると、XとXの転置行列の積の行列式は要素にかかわらず0になるようです。 実際に数値ではなく、abcdでやってみたところ0のようです。 この場合、逆行列は存在しないのではないかと思いますが、このヒントが間違っているとはあまり思えず、困っています。 補足ですが、この問題は最小二乗法をエクセルで行列を用いて行うという趣旨です。 もとのデータとして(x、y)の座標が4点与えられており、行列Xはxの要素を縦にならべたもの、Aは最小二乗法で求める一次関数式のパラメーターa,bで、YはXと同様座標のy要素です。 私の理解が間違っていて、何行何列という部分に誤りがあるなどの指摘があれば、ぜひお願いいたします。 そもそもある行列とその転置行列の積の逆行列は存在するのかどうかもお願いします。 締め切りが近く、ちょっとあせっています。 よろしくお願いします!!

  • 転置行列への変換が分かりません。

    転置行列への変換が分かりません。 現在、type型のrow行column列の行列(row >= 2, column >= 2, row != column)を、要素数がrow * column個ある配列arrayを用いて表現しています。更にR行C列目の要素はrow * C + R番目のarrayの要素で示しています。 そして転置行列ですが、行列type^(row * column)と行列type^(column * row)は要素数が同じなのでarrayと同じサイズの配列を用いて表現が可能ですし、ひとつずつ要素の置換を行えば新しく一時的にtype^(column * row)の行列を作って単純に代入処理をするよりもメモリに負担が掛からないはずです。 よって今は以下のアルゴリズムを考案し実装したのですが、問題が発生しました。 (以下配列i番目の要素をarray[i - 1]、行列matrixのa行b列の要素はmatrix[a - 1][b - 1]と記す。) ---- 入力 matrix in type^(row * column)とresult_matrix in type^(column * row)を示す、row * column個の要素を持つarrayが与えられる。 手順1 変数xに1を、変数yに0を代入する。一時要素領域tmp_elemにmatrix[x][y] = array[x + y * row]を代入する。 手順2 result_matrix[y][x] = array[y + x * column]とtmp_elemを交換する。 手順3 変数tにy + x * columnを代入し、xにtとrowの剰余を、yにtをrowで割った値の整数部を代入する。 手順4 xが1でかつyが0なら終了。そうでなければ手順2から再度処理を実行。 ---- 分かりやすく書くと、与えられた始点の位置にある転置前の行列としての要素を取得し、次に行列を既に転置された形のものとみなしてから、さっき取得した要素を転置後にあるべき場所へと移動させ、そこに元々あった要素に対して更に再帰的に手順を適応する感じです(実装ではループに落としていますが)。終了条件は「交換対象が始点へ戻ってきたとき」です。 しかし、次々と交換していく流れにおいて処理されない要素が出てきました。integer^(10 * 5)における以下の行列 ---- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, ---- の転置(仮) ---- 0, 10, 20, 30, 40, 1, 11, 7, 31, 41, 2, 12, 22, 32, 14, 3, 13, 23, 33, 43, 4, 21, 24, 34, 44, 5, 15, 25, 28, 45, 6, 16, 26, 36, 46, 35, 17, 27, 37, 47, 8, 18, 42, 38, 48, 9, 19, 29, 39, 49, ---- です。 ここではメインの流れmatirx[1][0] -> ... -> matrix[0][1]では走査できない要素の流れとして matrix[5][3] -> matrix[8][2] -> matrix[2][4] -> matrix[4][1] -> matrix[1][2] -> matrix[7][0] が存在しますが、検出できなかったこの流れにどの様な規則性があるのかどうかが分からないままです。 行列を転置行列に一時行列なしで変換する方法と、このアルゴリズムの不完全な部分を教えてください。 ><;

  • 転置行列の階数

    行列の階数と、その転置行列の階数は同じなるという定理の証明なのですが、理解できなくて困っています。 行列の階数=一次独立な行ベクトルの総数 転置行列の階数=一次独立な列ベクトルの総数 というところまでは理解できるのですが、一次独立な行ベクトルの総数と、一次独立な列ベクトルの総数は、何故一致するんでしょうか?

  • 大量のCSVデータを行列の変換をしてエクセルデータにまとめる方法について

    CSVファイルが4000個ほどあり、VBAを用い、そのファイルの行列変換をして、1つのエクセルファイルにまとめたいのですが、うまくいきません。どなたか教えていただけないでしょうか? CSVファイルは、以下の様な2列200行位あるものを、2列目のみ取り出し、エクセルファイルには1行(列ではなく)にして取り出したいのです。 変換前データー A列   B列 B013 毛 B014 54 B015 ポリエステル B016 36 B017 絹 B018 10 B020 0 B022 0 B023 ポリエステル B024 0 B025 キュプラ B026 0 B028 0 B030 0 B032 0  ・  ・  ・  ・  ・  ・ 取り込み変換後データ 1行: 毛 54 ポリエステル 36 絹 10 0 0 ポリエステル 0 キュプラ 0 0 0 0 のようにしたいのです。 どなたかお教えいただけないでしょうか? よろしくお願いいたします。

  • 転置行列の成分について

    線形代数学の転置行列について質問です A=(aij),B=(bij)を(m,n)型行列とするとき、Bの転置行列tBの第i行の成分を書き下せ。 という問題なのですが、 僕は「tBの第i行成分はBの第i列成分と等しいので b1i ,b2i ,…,bmiとなる」のだと思っていたのですが、友達に聞くと 「b1j,b2j,…,bmj」だと言われました。 そもそも「tB1の~」という部分が僕の考え間違いなのでしょうか。 どなたかわかりやすく教えてください、よろしくお願いします。

  • 転置行列と行列の和

    初めまして。 大学の授業でプログラミングのC言語を勉強しています。 4月からプログラミングを始めたばかりで、まったくの初心者です。 転置行列が作れなくて困っているのですが、 .datのファイルから転置させるのが上手くできません。 《kadai1.datの3行4列の行列Aと、kadai2.datの4行3列行列Bがある。 行列A、行列B、行列Aの転置行列を出力し、 行列Aの転置行列と行列Bの和を出力するプログラムを作る。 kadai1.datとkadai2.datは自分で作る。》 で、途中まで作ったのが以下です。 #include <stdio.h> #include <stdlib.h> #define ROW   3 #define COLUMN 4 int main(void) { FILE *fp; double a[ROW][COLUMN], b[ROW][COLUMN]; int i, j; if ( ( fp = fopen( "kadai1.dat", "r" ) ) == NULL ) { printf("ファイルが見つかりません : kadai1.dat \n"); exit(1); } printf("行列Aは次の通りです\n"); for ( i = 0 ; j < COLUMN ; j++) { scanf (fp, "%lf", &a[i][j]); printf ("%5.2f\t", a[i][j]); } printf("\n"); } if ( ( fp = fopen( "kadai2.dat", "r" ) ) == NULL ) { printf("ファイルが見つかりません : kadai2.dat \n"); exit(1); } printf("行列Bは次の通りです\n"); for ( i = 0 ; j < COLUMN ; j++) { scanf (fp, "%lf", &a[i][j]); printf ("%5.2f\t", a[i][j]); } printf("\n"); } return 0; } \の半角が出なかったので¥になってます。 (ごめんなさい!!) 上のプログラムで、行列Aと行列Bが出力できたのですが、転置と和のプログラムが出来ていません。 kadai1.datが、 1 2 3 4 5 6 7 8 9 10 11 12 kadai2.datが、 13 14 15 16 17 18 19 20 21 22 23 24 にしてみました。a1 a2 … c3 c4、でやってる人もいるみたいですが具体的な数字で作ろうと思っています。 お手数おかけしますが具体的にお答えいただければ幸いです。 どうぞよろしくお願いいたします。

  • エクセルファイルの一括変換・処理方法について

    エクセルファイルの一括変換・処理方法についてお聞きしたいことがあります。100行3列の数値データを持つエクセルファイルがあるとします。4列目に計算式例えば、D1=A1*B1をD列にフィルする作業を自動的に行い、かつ複数の、同様なデータを持つエクセルファイルにも一括して同一作業を行う方法を、どなたかご教授くださいませんでしょうか?おそらくマクロを使うこととなるかもしれませんが、もしそうでしたらそのマクロについてもお教えいただけるとありがたいです。よろしくお願いいたします

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

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

  • 固有値、転置行列の問題

    n行n列の行列Aについて 転置A = A A^2 = A のとき 固有値は 0か1になることを示したいのですが、 tは任意の実数で 行列式 | A - tE | = 0 を使って解こうとしてみたり、 Aを対角化しようとしてみたりしましたが、解き方がわかりません。 方針だけでも良いの教えてください。

  • Uとその転置行列の積について

    行列の積について質問です。 任意のベクトルに対する回転について調べていたところ、こちらのサイトで説明されていたのですが、 →ttp://www004.upp.so-net.ne.jp/hiromu-i/tips001.html U=(ux,uy,uz)t   (tは転置行列の記号) UtはUの転置行列 の時、 UUt= | uxux, uyux, uzux | | uxuy, uyuy, uzuy | | uxuz, uyuz, uzuz | というところが理解できなくて困っています。 Uは(ux,uy,uz)t と書いてあるので、 3行1列の行列と考えて、 Utは(ux,uy,uz)tの転置だから(ux,uy,uz)となるので、 1行3列の行列と考えました。 すると、UUtはスカラーになって UUt = ux^2+uy^2+uz^2となると思うのですが、 どう理解すれば UUt= | uxux, uyux, uzux | | uxuy, uyuy, uzuy | | uxuz, uyuz, uzuz | となるのでしょうか。 どなたか教えて下さい。 宜しくお願いいたします。