Win、Visual Studio
私は今3次元画像を2次平面にみて様々な処理を行っているのですが、
あまりにもプログラムが長いので上手く省略できないかと考えています。
現在は下記のように
変更したいのはfor文の順番のみなのにほとんど同じ処理を3回書いてしまっています。
これを上手くまとめることは可能なのでしょうか?
アドバイスよろしくお願いいたします。
for (int z = 0; z < 101; ++z){
for (int y = 0; y < 101; ++y){
for (int x = 0; x < 101; ++x){
//XY平面として参照した様々な画像処理
}
}
}
//ZX平面で処理
for (int y = 0; y < 101; ++y){
for (int x = 0; x < 101; ++x){
for (int z = 0; z < 101; ++z){
//ZX平面として参照した様々な画像処理
}
}
}
//YZ平面で処理
for (int x = 0; x < 101; ++x){
for (int z = 0; z < 101; ++z){
for (int y = 0; y < 101; ++y){
//YZ平面として参照した様々な画像処理
}
}
}
↓理想……? パターン0、1、2でfor文の回す順番を変えてくれるようにしたい……
//全ての平面
for (int pattern = 0; pattern < 3; ++pattern){
if (pattern == 0)for (int z = 0; z < 101; ++z)
if (pattern == 1)for (int y = 0; y < 101; ++y)
if (pattern == 2)for (int x = 0; x < 101; ++x)
{
if (pattern == 0)for (int y = 0; y < 101; ++y)
if (pattern == 1)for (int x = 0; x < 101; ++x)
if (pattern == 2)for (int z = 0; z < 101; ++z)
{
if (pattern == 0)for (int x = 0; z < 101; ++x)
if (pattern == 1)for (int z = 0; z < 101; ++z)
if (pattern == 2)for (int y = 0; y < 101; ++y)
{
//平面画像に対する画像処理
}
}
}
}
for文の順番を変えたい
Re: for文の順番を変えたい
こんな感じでしょうか? ※テストしていません
const int permutation[][3] = {
{2, 1, 0},
{1, 0, 2},
{0, 2, 1}
};
for (int pattern = 0; pattern < 3; pattern++) {
int c[3];
for (c[0] = 0; c[0] < 101; c[0]++) {
for (c[1] = 0; c[1] < 101; c[1]++) {
for (c[2] = 0; c[2] < 101; c[2]++) {
int x = c[permutation[pattern][0]];
int y = c[permutation[pattern][1]];
int z = c[permutation[pattern][2]];
// 処理
}
}
}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: for文の順番を変えたい
オフトピック
forをなんやかんやしてx,y,zのループの順序を変えたとしても,
>//XY平面として参照した様々な画像処理
>//ZX平面として参照した様々な画像処理
>//YZ平面として参照した様々な画像処理
の3つを,
>//平面画像に対する画像処理
という単一のコードで書かないとならないわけですよね?
(最も内側のループの中で「今がパターン1だから…」とかならないように)
>//XY平面として参照した様々な画像処理
>//ZX平面として参照した様々な画像処理
>//YZ平面として参照した様々な画像処理
の3つを,
>//平面画像に対する画像処理
という単一のコードで書かないとならないわけですよね?
(最も内側のループの中で「今がパターン1だから…」とかならないように)
int main( void )
{
int x=-100,y=-100,z=-100;
int *p[3][3] = {
{ &x, &y, &z },
{ &z, &x, &y },
{ &y, &z, &x }
};
const int SIZE = 3; //=101
for( int ptn=0; ptn<3; ptn++ )
{
std::cout << "ptn " << ptn << std::endl;
int &I = *p[ptn][0];
int &J = *p[ptn][1];
int &K = *p[ptn][2];
for( K=0; K<SIZE; K++ )
{
for( J=0; J<SIZE; J++ )
{
for( I=0; I<SIZE; I++ )
{
//x,y,zはptnに応じた順で変化していくけど…
std::cout << x << ", " << y << ", " << z << std::endl;
//今どの平面に着目してるのかを知らずに処理を書けるだろうか?
}
}
}
std::cout << std::endl;
}
//
//std::cin.ignore();
return 0;
}
Re: for文の順番を変えたい
みけCATさんusaoさんありがとうございました。
お二人のアドバイスを参考にして、無事まとめられました。
本当にありがとうございました
お二人のアドバイスを参考にして、無事まとめられました。
本当にありがとうございました
最後に編集したユーザー 小森 on 2015年7月02日(木) 13:14 [ 編集 1 回目 ]
Re: for文の順番を変えたい
解決でしたら、解決チェックをお願いします。
具体的には、投稿画面の「送信」ボタンの右にある「解決!」にチェックを入れてから返信してください。
記事の件名は変えないべきです。
具体的には、投稿画面の「送信」ボタンの右にある「解決!」にチェックを入れてから返信してください。
記事の件名は変えないべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)