質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

692閲覧

上と下のプログラムを同じ処理にさせたい。(for文の順序が曖昧になっています。)

serah.farron

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/01/11 11:46

編集2022/01/11 12:20

for (i = 2; i < 259; i++) { for (j = 2; j < 259; j++) { for (i2 = 0; i2 < 5; i2++) { for (j2 = 0; j2 < 5; j2++) { SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + i2 - 2][j + j2 - 2] * Btemp[i2][j2]; } } } } ② for (i = 2; i < 259; i++) { for (j = 2; j < 259; j++) { for (i2 = 0; i2 < 5; i2++) { for (j2 = 0; j2 < 5; j2++) { SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j + 2] * Btemp[i2][j2]; } } } }

i2とj2を消して②のプログラムを①のようにしたいです。
しかしfor文の意味を詳しく理解できていないのでこんがらがっています。
ご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/01/11 12:10

どういうふうに違う処理になってるんでしょうか。 そこらへん詳しく説明しよう
serah.farron

2022/01/11 12:13

質問ありがとうございます。 i2とj2を消してiとjのみのプログラムを組みたいと思っております。
BeatStar

2022/01/11 12:13

まず、何がしたいのでしょうか? そもそもプログラム云々は置いといて、現実世界で説明できますか? たとえば、『総和を求めたい』とか『画像A,Bがあり、それぞれの位置を行列の和みたいに計算したい』とか。目的がはっきりしないので回答しづらいです。(出来なくはないが、当てずっぽうになる)
BeatStar

2022/01/11 12:14

それと、コードは"<code>"または"<コード>"のボタンを押して出来る奴の中に書きましょう。今のままでは非常に読みづらいです。 質問は編集できるので編集しましょう。
int32_t

2022/01/11 14:06 編集

> i2とj2を消してiとjのみのプログラムを組みたい なぜそうしたいのですか? ①のほうがだいぶ簡潔なコードに見えます。 追記: あ、②のようにしたいんじゃなくて、①のようにしたいのですね。読み違えてました。どっちにしても意図がよくわかんないですが。
jimbe

2022/01/11 13:56

> i2とj2を消して②のプログラムを①のようにしたい ① にも i2 と j2 がありますけど?
guest

回答2

0

i2,j2 のループが i,j のループの中に出てくるのが嫌ということであれば、 i2,j2 のループを別関数にしてしまえば良いのではないでしょうか。

投稿2022/01/11 14:01

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私が計算ミスしている可能性があるのであくまで流れで読んでください。


とりあえず、ロジックを考えてください。
確かに混乱するのもわからないでもないですが、その場合は紙かメモ帳かなんかに書いてみましょう。

プログラミングってのは『こう書けばいい』ってものではなく、現実世界のシミュレーションです。
そもそも現実世界で実現不可能であればプログラムに落とし込むことはほぼ不可能です。(例外はあるにはあるが、それは物理的なものであって、ロジック面ではない)

要件がまったくわからないので妄想で解析します。

SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j - 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j - 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j + 1] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 1][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 1][j + 2] * Btemp[i2][j2]; SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i + 2][j + 2] * Btemp[i2][j2];

これを見て、『規則性』を見付けます。

少なくとも計算式としては、

SumBVu[i][j] = SumBVu[i][j] + VuData_Th[ X ][ Y ] * Btemp[i2][j2] ですね。

でもよーく見てください。代入先と 足し算のSumBVu...の方と同じです。i,jの値も同じです。

ということは、C言語,C++,C#とかでなら +=演算子が使えるはずです。

SumBVu[i][j] = SumBVu[i][j] + VuData_Th[i - 2][j - 2] * Btemp[i2][j2];
↓↓
SumBVu[i][j] += VuData_Th[i - 2][j - 2] * Btemp[i2][j2];

VuData_Th[ X ][ Y ] の X, Y に入るものを見てみると、

-2, -2 -1, -2 0, -2 +1, -2 +2, -2 +2, -1 -2, -1 -1, -1 0, -1 +1, -1 +2, -1 -2, 0 -1, 0 0, 0 +1, 0 ...

と25通りありますね。(上記の数字は i, j を省いた数字部)

で、出てくる数字を見ると { -2, -1, 0, +1, +2 } の5通りの数字からなるっぽいですね。

で、色々考えてみると、それぞれの順列……でいいのでしょうか? みたいな感じですよね。

[X][Y]なので枠は2つ。X,Yそれぞれ 5通りの数字が入る。{ -2, -1, ..., +2 }の 5つ。
つまり、5^2通り。(ちなみに5の2乗と読む)

5^2 = 25通りなので、計算したいパターン数とも一致しますね。

よって、{ -2, -1, .., +2 } をぞれぞれ 2個並べた組み合わせをX,Yとして…みたいな感じに見えますね。

つまり、SumBVu[i][j] += VuData_Th[i + X][j + Y] * Btemp[i2][j2];という計算に端折れますね。

ただ、5つの候補 = { -2, -1, 0, +1, +2 } から二枠だけしか取りません。つまり、5P2 です。
この取り出し方はここでは省略します。

このX,Yのペアさえわかれば、後は25通り分ループして上記の計算式に当てはめて計算すれば行けるはずです。

たとえば、このX,Yのペアは(自作の)関数で求めて行うとか。

ただ、単純に考えると、上記のアルゴリズムでは計算量が O(n^5)になりますね。
割とデカいので計算量をそぎ落とせるのならそぎ落とした方がいいかもしれません。

投稿2022/01/11 13:42

編集2022/01/11 13:44
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問