例えば、10×10の配列データとして、以下を定義するとします。
table99[10][10] = {
{0,0,0,0,0,0,0,0,0,0}
{0,1,2,3,4,5,6,7,8,9}
{0,2,4,6,8,10,12,14,16,18}
:
:
:
{0,9,18,27,36,45,54,63.72.81}
}
これを定数ファイルとして、Excelから自動で出力したいと考えています。
10×10くらいなら、無理やりExcelで表作って、CSV保存して切った貼ったでもなんとかなるのですが
256×256のテーブルを10個作らないといけないことが分かり、しかも数値が一部見直しになる可能性もありってことで、ちょっと省力化できないかな、と考えています。
3)できれば、10点×10点くらいをExcelに記入したら、256×256点のテーブルへ展開したい。
これがよく分からなかったので、以下のようにしました。
Const max = 256 ' 256 × 256 の表を作成 Sub make_data() For r = 1 To max For c = 1 To max Cells(r, c) = (r - 1) * (c - 1) Next Next End Sub ' 256 × 256 の表を配列の宣言形式でファイルに保存 Sub output_data() Filename = "D:\table99.h" Open Filename For Output As #1 Print #1, "double table99["; max; "]["; max; "] = {" For r = 1 To max Print #1, "{"; For c = 1 To max Print #1, Format(Cells(r, c), "0.#########"); If c <> max Then Print #1, ","; Else Print #1, "}," End If Next Next Print #1, "};" Close #1 End Sub
256×256 の表は、10×10 の領域をコピーする、もしくは、ある範囲を決めてランダムな数字で埋める、とか、いろいろやり方はあるでしょうが、サブルーチン make_data のループの中身を書き換えれば良いかな、と。
簡単にいうと、10×10(16×16とかでもOK)くらいの入力点の間を内挿して、256点×256点のテーブルを作りたいのです。
内挿する点は与えた点の直線補間でOK。
...
※贅沢を言えば、入力する点数は10×10~20×20くらいで対応できると嬉しいです。(出力は256^2で固定OK)
データを作るところを以下のようにしました。
Const from_max = 10 Const max = 256 Function calc_interpolation(r, c) mm = CDbl(max - 1) x = (c - 1) * (from_max - 1) / mm + 1 y = (r - 1) * (from_max - 1) / mm + 1 x0 = Application.RoundDown(x, 0) x1 = x0 + 1 y0 = Application.RoundDown(y, 0) y1 = y0 + 1 v00 = Cells(y0, x0).Value v10 = Cells(y0, x1).Value v01 = Cells(y1, x0).Value v11 = Cells(y1, x1).Value v = (x1 - x) * ((y1 - y) * v00 + (y - y0) * v01) + (x - x0) * ((y1 - y) * v10 + (y - y0) * v11) calc_interpolation = v End Function Sub make_data() Set to_sheet = Worksheets("Sheet2") For r = 1 To max For c = 1 To max to_sheet.Cells(r, c).Value = calc_interpolation(r, c) Next Next End Sub
選択中のシートの左上10×10 の領域を、"Sheet2" の 256×256 の領域に書き出します。
先の回答のファイルへの書き出しと共有してるので、変数名が変な感じになってますが、対象の大きさは以下の定数で変更できます(A1 から始まるところと、行と列の大きさが等しいところは固定です)。
データの補間には、画像を拡大するときに使われる「双一次補間」というのを使いました。
http://imagingsolution.blog107.fc2.com/blog-entry-142.html
ちょっと遅いです。10秒近くかかると思います。
上手くやれば、もっと速くできると思いますが、そう何度も使うマクロではないと思うので
要求仕様をまとめると
1)要素数は256×256
2)各要素の中身は符号付浮動小数で記載。
3)できれば、10点×10点くらいをExcelに記入したら、256×256点のテーブルへ展開したい。
4)256点 という要素数は変動なし。簡易に変更できればなおよい。
5)256×256のテーブルはExcel上でみれなくてもOK。いきなりc言語用ファイルを吐いてもOK。
こんな感じです。
その他、不明点あれば追加します。
また、参考になるサイトの紹介などでもOKです。
何卒宜しくお願いします。