プログラムに悩んでいるものです.
とある画像処理のプログラムを組んでいるのですが,処理が遅くテーブル引きを組んでいます.
三角関数などはすんなりできたのですが,質題にもある通りsqrt(a^2+b^2)が実現できず,この場を借りて質問させていただきました.
以下にプログラムの一部を示します.
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void filter(unsigned char* d, short *dx, short *dy, int w, int h)
{
///// テーブル生成 /////
static int c_size = 0;// static 次の呼び出しでも値保持
static double *c_sqrt = NULL;//
c_size = 255; // u,v:0~255
c_sqrt = (double *)malloc(sizeof(double)*c_size*c_size);// 領域確保
for(int i=0; i<c_size; ++i){ // 有りえるすべての値を生成
for(int j=0; j<c_size; ++i){
c_sqrt[i*j] = sqrt( (double)(i*i + j*j) );
}
}
///// d = sqrt(dx^2 + dy^2) /////
for(int y = 1; y < h-1; ++y){
for(int x = 1; x < w-1; ++x){
double u = (double)dx[y*w+x];
double v = (double)dy[y*w+x];
int val = (int)c_sqrt[ (int)(u*v) ] /4;
if (val>255) val=255;
d[y*w+x] = val;
}
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
見てご察し頂ける(?)と思いますが,この関数は何回も呼び出すので,上のほうででテーブル引きしようとしてます.
ただ明らかなプログラム経験不足のためかうまくいってません.
個人的にはc_sqrtを別途関数c_sqrt(u,v)にしたほうがよいのかと思ってます.
どういうプログラム記述をすれば,このテーブル引きが実現できるでしょうか?
ご回答,お力添え,よろしくお願い致します.
No.1ベストアンサー
- 回答日時:
何をやりたいのか今ひとつ見えませんが、
c_sqrt[i*j] = sqrt( (double)(i*i + j*j) );
とやってしまうと、
i=2、j=8の時には
c_sqrt[16]=√(2*2+8*8)=√68
i=4、j=4の時は
c_sqrt[16]=√(4*4+4*4)=√32
ということで、c_sqrt[16]が上書きされてしまいますが、それで良いんでしょうか?
sqrt(a^2+b^2)
の値引きテーブルを作るならc_sqrt[a][b]のような二次元配列で用意してやるのが常道ではないかと思います。
ご回答ありがとうございます.
何をやりたいのかわからなくてすいませんでした.説明不足だったと思うし,プログラム構成がダメダメだったと思います.
ご指摘の通り,二次元配列をつかったら動作しました.
これ関連の質問をしているので,お力添え頂けると幸いです.
質問URL:http://okwave.jp/qa/q7112041.html
No.5
- 回答日時:
1. static double c_sqrt[c_size][c_size];をグローバルに用意する。
static *double にして動的に確保しても良い。が、めんどい。
まずは静的に作れるようにしてから改造してはどうか。
2. 配列テーブルを作る。
void make_csqrt(){
int i,j;
for(i = 0; i < c_size; i++)
for(j = 0; j < c_size; j++) c_sqrt[i][j] = sqrt((double)(i*i) + (j*j));
}
3. 呼び出す。
double mysqrt(int a,int b){return c_sqrt[i][j];}
備考:
もしも、使用する値に特定の偏りがあるようだったら、「ハッシュ法」を使用すればよい。
サンプルは山ほど落ちている。
ご回答ありがとうございます.
ハッシュ法などは知らなかったので,勉強になりました.
この質問関係の質問をしているので,お力添え頂けると幸いです.
質問URL:http://okwave.jp/qa/q7112041.html
No.4
- 回答日時:
2次元配列を使わないなら
宣言 c_sqrt[ROW][COL]
使用 c_sqrt[row][col]
なら
→c_sqrt[row * COL + col]
という感じです。
同様なことは
> d[y*w+x] = val;
で使用してますよね。
このプログラムなら COL = c_sizeなので
c_sqrt[i*c_size + j] = sqrt( (double)(i*i + j*j) );
あと、これ、何回も呼び出すとありますが、そのたびにc_sqrtを確保→計算するようになってます。これではテーブル引きにした意味がありません
ご回答ありがとうございます.
ご指摘の通り,テーブル引きの意味がない状態だったので,助かりました.
これ関連の質問をしているので,お力添え頂けると幸いです.
質問URL:http://okwave.jp/qa/q7112041.html
No.3
- 回答日時:
>個人的にはc_sqrtを別途関数c_sqrt(u,v)にしたほうがよいのかと思ってます.
関数名は置いとくとして、ご自分でも思ってらっしゃる通り別途関数にした方がよいかと思います。
テーブルは一次元配列でやろうとするより、素直に二次元配列の方がわかりやすいのではないでしょうか。
>c_sqrt[i*j] = sqrt( (double)(i*i + j*j) );
それもあって、c_sqrtの添え字が i*j とおかしな事されてるようですし。
ご回答ありがとうございます.
ご指摘の通り,二次元配列じゃないとおかしな状態だったので,助かりました.
これ関連の質問をしているので,お力添え頂けると幸いです.
質問URL:http://okwave.jp/qa/q7112041.html
No.2
- 回答日時:
>c_sqrt[i*j] = sqrt( (double)(i*i + j*j) );
c_sqrt[i*j]
としているのがまずいと思います。
【理由】
例として、i が 0 の場合を考えてみます。このとき、j がどの値であっても i*j は 0 です。
その結果、せっかく j を 0 から 254 までループさせても、c_sqrt[0] を255回書き換えるだけです。
ご回答ありがとうございます.
ご指摘の通り,c_sqrtがまずかったです.
これ関連の質問をしているので,お力添え頂けると幸いです.
質問URL:http://okwave.jp/qa/q7112041.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
2分法で方程式の複数の解を自...
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
float型とdouble型の変数の違い...
-
-1.#IND00と出てしまうのですが...
-
C言語で-23乗を取り扱うには
-
C 開放してるのにエラー(doubl...
-
C言語 関数プロトタイプ宣言の...
-
C# 浮動小数の数値文字列化
-
DWORDの警告
-
線形補間
-
1円、2円、3円・・・と貯金...
-
Cで3乗根を求める方法
-
C言語でのsinxのマクローリン展...
-
関数におけるif文とreturn文に...
-
「割り算」 と 「分数の掛け算」
-
C言語でdouble型の小数点の引き...
-
int とdoubleの比較
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
Cで3乗根を求める方法
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
int とdoubleの比較
-
関数におけるif文とreturn文に...
-
C言語初心者 構造体 課題について
-
c言語のコンパイルエラー canno...
-
C言語 関数プロトタイプ宣言の...
-
C言語を実行すると-infが出てき...
-
float?数字の後にLがつくもの
-
数値を指数部と仮数部に分離したい
-
difftime()について
-
浮動小数点数が表示されないん...
-
たくさんの数の平均を求める方...
-
DWORDの警告
-
-1.#IND00と出てしまうのですが...
おすすめ情報