トップページ⇒tech
1001コメント370KB

C/C++の宿題を片づけます 49代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/10(水) 17:10:47

あなたが解けないC/C++の宿題を片づけます
――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
―――――――――――――――――――――――――――――――

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: Windows/Linux/等々
 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等
 [3.3] 言語: C/C++/どちらでも可 のいずれか
[4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

【前スレ】
48代目: http://pc8.2ch.net/test/read.cgi/tech/1121471445/

【歴代スレは>>2-13】
0263デフォルトの名無しさん2005/08/26(金) 23:00:28
>>262
403 forbidden
0264デフォルトの名無しさん2005/08/26(金) 23:15:34
>>262
要は途中でunsined longなりの最大値超えるからでしょ?
適当な要素数のint型配列つかって10進数を表して
そいつを表示する部分と、乗算する部分作った方がいい希ガス

とりあえず自分で作ろうと思ってた奴の表示と乗算の部分だけ完成させたから
参考にでもしてくれ
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/876.txt
0265デフォルトの名無しさん2005/08/27(土) 00:33:47
>>262
いろいろ目をつぶったら何も見えなくなった。
って後半(2->10)も何もないじゃないかあ〜!
(後、結果の保持or出力の形式の条件(有無さえ)が不明だなあ。
128桁の2進数値の保持に 128bit以上の整数型が必要になるのは理解済み?)
0266デフォルトの名無しさん2005/08/27(土) 01:55:38
そのあたりは理解しています。
数値ではなく、文字として処理して計算?という案はあるのですが
加算処理をどう表現していいのかがわからず、です。

計算結果はそのまま 123456798456132・・・というふうに表示し、プログラム終了です。
0267デフォルトの名無しさん2005/08/27(土) 02:17:58
>>266
文字として処理っていうのは筆算での掛け算をするってことか?
02682582005/08/27(土) 02:37:59
桁数が大きくなると、普通に数値として計算ができなくなるので
数字の足し算を文字と文字の組み合わせで表現すればいいのでは?と考えてました。
1と1が組み合わさるときは2、1と2が組み合わさるときは3・・・とパターンを決めて計算を表現するということです。
うまく説明できない・・・
とりあえず、普通の足し算を行うのはあきらめる気でいました。
0269デフォルトの名無しさん2005/08/27(土) 02:40:10
>>266
> 数値ではなく、文字として処理して計算?という案
10進数の数値に対して 1桁に1バイト割り当て&その値空間が '0' 〜 '9' ってことか?
02702582005/08/27(土) 02:48:51
>>269
まさにそのとおりです。


と、ここまで書いておいて別の方法に気がつきました。
大きな数を4桁ずつとかに区切り、配列に格納したモノ同士を足していくほうが
繰り上がりの問題も含めて単純に解決できそうです。
今まで考えでは1桁ずつ計算していましたが、こちらのほうが楽かつ簡単な気がします。

考えがまとまらずにフラフラしてしまって申し訳ありません。
なかなかうまく進まず焦ってしまっています。
一旦自分で考え直してもう一度質問すべきことを練り直します。
0271デフォルトの名無しさん2005/08/27(土) 03:13:40
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): バイナリのファイルを4byeづつ読み込んでヒストグラムを求める。
[3] 環境
 [3.1] OS: Linux
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: [2005年8月28日12:00まで]
[5] その他の制限:

問題文ではなく口頭で言われたので、言葉足らずのところがあると思いますが、
よろしくお願いいたします。
口頭では、「例えば、12バイトのバイナリファイルがあったとする。
そのファイルを4バイトずつ読み込み、それらを十進法であらわすと100、200、100だったとする
するとヒストグラムは(もちろん2の128乗の場合があるわけで出現してないものも表記すること)
0  |
1  |
・  |
・  |
100|**
200|*
(あとは省略)となる。 2の128乗の場合があるわけでターミナルに上のように表すのはどうかと思うので
エクセルなどでヒストグラムを作れるようにすること。といわれました。どうかよろしくお願いいたします。

0272デフォルトの名無しさん2005/08/27(土) 04:00:59
いちおう確認させてもらう。

習ったデータ構造は?(2分探索木、ハッシュ、mallocする形の二次元配列)
習ったバイナリファイルを読み込む方法は?
出力はアスタリスクの横棒とエクセルファイル、どちらを作ればいいの?
0273デフォルトの名無しさん2005/08/27(土) 04:28:11
>>271
普通にバイナリモードで開いて、freadでunsigned longの変数に
放り込めばよくないか?
0274デフォルトの名無しさん2005/08/27(土) 04:41:58
俺の教科書だと、
unsigned long x;
x = (getchar() & 0xff) << 24;
x |= (getchar() & 0xff) << 16;
x |= (getchar() & 0xff) << 8;
x |= (getchar() & 0xff);
ってなっとる(爆) これもなんだかな・・・だが。

unsigned longが64ビットじゃない処理系って、俺は知らんけど、
fread(&x, 4, fp)とかだと、処理系依存じゃねぇか?
0275デフォルトの名無しさん2005/08/27(土) 04:44:47
>>272
習ったデータ構造についてですが、正直授業についていけなくてわかりません。
出力についてですが、0〜2の32乗の値のそれぞれの出現頻度をグラフ化したいわけで、
アスタリスクの横棒ですとターミナルに表示するのは非常に困難だと思いますし、
もし可能であれば、出力されるファイルをエクセル形式のファイルにして、それを
エクセルで開いて、縦軸に0〜2の32乗それぞれの出現頻度が、
開いたエクセルファイルに10進法で書かれていれば、それらから
グラフを作りたいなと考えております。
他の方法としても、ターミナルに一度に0〜2の32乗の出現頻度を表示することはできないので
100づつくらい、出現頻度を表示させておいて、それをエクセルに少しずつこぴぺしていこうと
考えております。私の発想ではこのくらいのことしかおもいつかないのですが
もっといい方法があったらそちらでプログラムを組んでいただけると助かります。
私の説明不足なために理解に苦しまれるところがたくさんあるとは思います。すみません。

0276デフォルトの名無しさん2005/08/27(土) 04:50:07
エクセルも64K行しか作れないわけだが。
0277デフォルトの名無しさん2005/08/27(土) 04:51:57
>>273
私がやってみた方法は、
#define BIG 2の32乗
hisutoguramu[BIG]という配列を用意いたしました。配列を初期化して
そして
hisutoguramu[in_data[i]]=hisutoguramu[in_data] + 1 ;
in_data[i]というのは元ファイルを4バイトずつ読み込んでいるものでiは
元ファイルのサイズ/4までしかループさせない
というふうにしてプリントfで表示させる方法をしてみようとしたのですが
できませんでした。セグメンテーション違反もでまして、無理でした。
0278デフォルトの名無しさん2005/08/27(土) 04:53:11
>>276
それは知りませんでした。
何かいい方法で、0〜2の32乗を横軸とし、縦軸を出現頻度としたグラフは作成できないのでしょうか?
0279デフォルトの名無しさん2005/08/27(土) 04:57:08
>>278
試しに、2の32乗がどんな値か計算して味噌。
できれば、それを表示するためにどれだけのメモリが必要になるかも。

#こいつの頭は大丈夫なんだろうかと不安になる恭子の頃。
0280デフォルトの名無しさん2005/08/27(土) 04:58:09
>>278
そもそも2^32もの行(列)数をグラフ化できるソフトなんてあるのか?
0281デフォルトの名無しさん2005/08/27(土) 05:06:06
>>279
4、294、967、296ですね・・・。
四十億ですね・・・。
無知ですみませんでした。
あとエクセルで確認したところ65536までしか縦軸がありませんでした

口頭で聞いた問題でしたので、271ような課題を出す先生はいらっしゃらないと思ったほうが
いいのでしょうか?

テンプレに書かれているように、問題文を途中で帰るのは失礼だとは思いますが、
少し変えさせてもらってもよろしいでしょうか?
0282デフォルトの名無しさん2005/08/27(土) 05:07:45
Linuxならgnuplot用のデータ吐けばいいんでないか?
0283デフォルトの名無しさん2005/08/27(土) 05:26:22
>281
変えるのならどうぞ。

>271ような課題を出す先生はいらっしゃらないと思ったほうが いいのでしょうか?
宿題としては、難儀です。32ビットだとデータ構造とかファイルサイズとか気にするんで。
限界に近いところでプログラムを組むことを経験させる・・・という意図ならありです。

なにか別の作業の一環でやってるなら、全データを扱うっていうのはヘンかな・・
出現数が上位のものをリストアップする・・・とか。ある範囲で区切るとかするんじゃないかな。

モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
0284デフォルトの名無しさん2005/08/27(土) 06:11:08
271です。先生、TAの雰囲気から察するに難しい課題ではないと思いますので
お言葉に甘えて問題を変えさせていただきます。

[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): バイナリであらわされているファイルを1byeづつ4バイト区切りで読み込んでヒストグラムを求める。
[3] 環境
 [3.1] OS: Linux
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: [2005年8月28日12:00まで]
[5] その他の制限:

例えば、A,B,C,Dそれぞれ1バイトで表現されていて、
ファイルとしては A1,B1,C1,D1、A2,B2,C2、D2、・・・An、Bn,Cn,Dnとなっていて
Aだけのヒストグラム Bだけのヒストグラム Cだけのヒストグラム Dだけのヒストグラムを求めたいです。
例えば縦軸は 0〜(読み込むデータサイズ/4)  横軸は0〜255であらわされることとなります。
問題文を変え、言葉が足りないところも多数ありますがどうぞよろしくお願いいたします。   
0285デフォルトの名無しさん2005/08/27(土) 06:16:31
>>283
>モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
画像のRGBのようなヒストグラムだと思っていただければいいと思います。
RGBにもう一つの要素が増えたと思っていただければなと思います。
0286デフォルトの名無しさん2005/08/27(土) 06:20:50
・・・あー。そりゃ、R面G面B面α面ごとにヒストグラム作るべきだわ。
0287デフォルトの名無しさん2005/08/27(土) 06:44:11
$ ./a.out inputfile >outputfile

#include <stdio.h>
#include <stdlib.h>

#define NPLANE 4

int main(int argc, char *argv[])
{
  static unsigned long count[NPLANE][256] = {0};
  int c, plane, i;
  FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
  for (plane = 0; (c = fgetc(fp)) != EOF; plane = (plane + 1) % NPLANE)
    count[plane][c]++;
  for (i = 0; i < 256; i++) {
    printf("%d,%lu", i, count[0][i]);
    for (plane = 1; plane < NPLANE; plane++)
      printf(",%lu", count[plane][i]);
    printf("\n");
  }
  return 0;
}
0288デフォルトの名無しさん2005/08/27(土) 06:49:42
すまん。planeじゃハズいわ。plainな。
0289デフォルトの名無しさん2005/08/27(土) 08:28:28
>>286
それぞれの要素ごとに作るべきでしたか。

>>287
レス遅れて申し訳ありません。
さっそくためにしてみます。

ありがとうございます。
0290デフォルトの名無しさん2005/08/27(土) 08:51:07
>>287
ありがとうございます。
適当なバイナリを作って確認したところそのとおりになりました。
直接会ってお礼をいいたいところですが、本当にありがとうございます。
本当に助かりました。ありがとうございます。
0291デフォルトの名無しさん2005/08/27(土) 23:14:58
>直接会ってお礼をいいたいところですが、
ちょっと引いたぞ
0292デフォルトの名無しさん2005/08/28(日) 02:31:36
290です。何度も申し訳ございません。
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): バイナリのファイルを読み込み、ヒストグラムを求める。
[3] 環境
 [3.1] OS: Linux
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: [2005年8月28日12:00まで] 過ぎても提出できます。
[5] その他の制限:

問題文ではなく口頭で言われたので、言葉足らずのところがあると思いますが、
よろしくお願いいたします。

例えば、R,G,B,αがそれぞれ1バイトで表現されていて、
ファイルとしては R1,G1,B1,α1、R2,G2,B2、α2、・・・Rn、Gn,Bn,αnとなっていて
そこでαは無視して、R,G,Bをワンセットとして考え、284でいったようなR,G,Bそれぞれではなく
R,G,Bをワンセットとしてヒストグラムを求めたいです。
287のように出力させていただければ自分でエクセルを使ってヒストグラムを求めたいと考えております。
どうぞよろしくお願いいたします。   
0293デフォルトの名無しさん2005/08/28(日) 02:56:37
バイナリをテキストに変換してくれって言ってるんですか?
例)
R1,G1,B1,
R2,G2,B2,
.......
0294デフォルトの名無しさん2005/08/28(日) 03:12:24
>292
1)出力形式プリーズ
>287の例だと
・1行1レコードのテキストファイル。
・1レコードに含まれるフィールドはコンマで区切られる。
・フィールドは順に、値,Rの頻度,Gの頻度,Bの頻度,αの頻度。
例
0,1,0,100
1,2,1,40
...
255,100,0,0
というふうに書く。
2)メンドイからバイナリをどっかにおくと、いいかも。
0295デフォルトの名無しさん2005/08/28(日) 03:12:51
>>293
はい。

RGB値   出現頻度
0         9
1      25
2 0        
3         109 
・ ・
・         ・
・
2の24乗    13

出現頻度が0の場合は表示しないようにすればなんとか収まると思うのでよろしくお願いします。
表示しないでおくと下のようになります

RGB値   出現頻度
0         9
1      25      
3         109
・         ・
・
2の24乗    13
0296デフォルトの名無しさん2005/08/28(日) 03:14:08
RGB値の値の計算式をR,G,Bを使ってあらわすこと>295
0297デフォルトの名無しさん2005/08/28(日) 03:16:38
すみません ずれてました

>>293


RGB値   出現頻度
0         9
1       25
2 0        
3         109 
・ ・
・         ・
・
2の24乗    13

出現頻度が0の場合は表示しないようにすればなんとか収まると思うのでよろしくお願いします。
上のようにしてもプログラムできるというなら上のようなバージョン(出現頻度が0でも表示する)と
下のバージョン(出現頻度が0の場合は表示させない)二つしてもらえると助かります。
表示しないでおくと下のようになります。

RGB値   出現頻度
0         9
1       25      
3         109
・         ・
・
2の24乗    13

0298デフォルトの名無しさん2005/08/28(日) 03:20:03
>>294
287のような出力形式でいいですがもっといい方法があるならそちらを使ってもらって
下さると助かります。グラフにするときに便利な出力にしたいと考えております。
287の場合は最大Xが255だったのであの出力形式をエクセルにこぴぺして作れましたが
今回の場合は2の24乗になるのでなにか上手な方法があったらとおもっております。

>2)メンドイからバイナリをどっかにおくと、いいかも。
どういう意味でしょうか?無知ですみません。

みなさん深夜にありがとうございます。
0299デフォルトの名無しさん2005/08/28(日) 03:20:37
なんか・・・出現数に応じたデータ圧縮かなぁ。とか思いつつ、生暖かく見ている。
0300デフォルトの名無しさん2005/08/28(日) 03:22:42
2の24乗!!???
そんなに....
0301デフォルトの名無しさん2005/08/28(日) 03:23:39
>>296
無知ですみません。それはどのような意味でしょうか?
0302デフォルトの名無しさん2005/08/28(日) 03:28:08
>>299
あ・・・確かにそのとおりです。正直驚きました。なぜかというとTAではないドクターに知り合いがいて
少し相談したんですが彼もそういってました。このあとなにかしらの符号化?につなげていくのではと

>>300
やはり多くてグラフ化できないですかね?
それなら出現頻度が0の場合は消していけばなんとかならないですかね・・・
0303デフォルトの名無しさん2005/08/28(日) 03:30:35
>>302
絶対にそれぞれの値の棒グラフを作らねばならないのか?
度数分布表とかではなく?
0304デフォルトの名無しさん2005/08/28(日) 03:33:19
>>303
ヒストグラムを作ってということだったので特に指定はありませんでした。
私が勝手に判断して値の棒グラフと考えました。
度数分布表というのはよくわからないのでぐぐってきますがそれでいけそうでしたら
それでやってもらえると助かります

みなさんありがとうございます。
0305デフォルトの名無しさん2005/08/28(日) 03:36:30
>>303
2の16乗で区分すると2の8乗の階級ができます。RGBで考えたときにRGが同じで
Bが違っても同じになるというのはこの課題ではだめだと思います。
0306デフォルトの名無しさん2005/08/28(日) 03:37:41
>301
R成分,G成分,B成分をまとめて表すとき、
R * 256^2 + G * 256 + B
B * 256^2 + G * 256 + R
G * 256^2 + R * 256 + B
B * 256^2 + R * 256 + G
という組み合わせは見たことがあるので、そのうちのどれか知りたかった。
(ここではべき乗を^で表した)
0307デフォルトの名無しさん2005/08/28(日) 03:46:35
>>306
無知ですみません。
RGBαRGBα・・・・で構成されているファイルをαを無視して、
RGBをワンセット(1ピクセル?)で考えて
どのようなRGBが出現頻度が高いのかを知りたいと考えております。

回答になってたでしょうか?本当にすいません。
0308デフォルトの名無しさん2005/08/28(日) 03:51:18
#include <stdio.h>
long getval(FILE *fp)
{
  int r, g, b, dummy;
  if ((r = fgetc(fp)) == EOF)
    return EOF;
  if ((g = fgetc(fp)) == EOF)
    return EOF;
  if ((b = fgetc(fp)) == EOF)
    return EOF;
  if ((dummy = fgetc(fp)) == EOF)
    return EOF;
  return (long) r << 16 | (long) g << 8 | b;
}
int main(int argc, char *argv[])
{
  static unsigned long count[256L*256*256] = {0};
  long i;
  FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
  while ((i = getval(fp)) != EOF)
    count[i]++;
  for (i = 0; i < 256L*256*256; i++)
    if (count[i]) /* 全要素を出力するにはこの行を削除 */
      printf("%ld\t%lu\n", i, count[i]);
  return 0;
}
0309デフォルトの名無しさん2005/08/28(日) 04:02:19
>>308
ありがとうございます
動作実験をしてみたいと思います
0310デフォルトの名無しさん2005/08/28(日) 04:13:51
#include <stdio.h>
#include <stdlib.h>
#define DATA_SIZE 16777216
#define RGB_MAX 255
long data[RGB_MAX][RGB_MAX][RGB_MAX];
struct RGB {
 unsigned char r;
 unsigned char g;
 unsigned char b;
 unsigned char alpha;
} rgb;
int main(void)
{
 FILE *fp;
 int i, r, g, b;
 if((fp=fopen("ファイル名", "rb")) == NULL) exit(1); /* ファイルが開けなかった */
 /* RGBのそれぞれの組み合わせをインクリメントしていく */
 for(n=0; n<DATA_SIZE; n++) {
  fread(&rgb, sizeof rgb, 1, fp);
  data[rgb.r-1][rgb.b-1][rgb.b-1]++;
 }
 fclose(fp); /* ここで一旦ファイルを閉じる */
 if((fp=fopen("textdata", "w")) == NULL) exit(1); /* ファイルが開けなかった */
 fprintf(fp, "r,g,b,頻度");
 for(r=0; r<RGB_MAX; r++)
  for(g=0; r<RGB_MAX; g++)
   for(b=0; r<RGB_MAX; b++)
    fprintf(fp, "%.3d,%.3d,%.3d,%d,\n", r, g, b, i[r][g][b];
 fclose(fp);
 return 0;
}
03113102005/08/28(日) 04:20:19
げ、最後のr, g, b, i[r][g][b]は
r+1, g+1, b+1, data[r][g][b]と読み替えてください。できたらこれも実験してもらえたら嬉しいです。
0312デフォルトの名無しさん2005/08/28(日) 04:22:55
0〜255だと256個必要だな。>310
03133102005/08/28(日) 04:25:01
Unicode識別子は無効だって....error
03143102005/08/28(日) 04:27:12
僕のは、試さないでください....。orz
0315デフォルトの名無しさん2005/08/28(日) 04:44:17
#include <stdio.h>
#include <stdlib.h>
#define DATA_SIZE 16974593
#define RGB_MAX 256
long data[RGB_MAX][RGB_MAX][RGB_MAX];
struct rgb_data {
<TAB>unsigned char r;
<TAB>unsigned char g;
<TAB>unsigned char b;
<TAB>unsigned char alpha;
} rgb;
int main(void)
{
<TAB>FILE *fp;
<TAB>int i, r, g, b;
<TAB>if((fp=fopen("ファイル名", "rb")) == NULL) exit(1); /* ファイルが開けなかった */
<TAB>/* RGBのそれぞれの組み合わせをインクリメントしていく */
<TAB>for(i=0; i<DATA_SIZE; i++) {
<TAB><TAB>fread(&rgb, sizeof rgb, 1, fp);
<TAB><TAB>data[rgb.r][rgb.g][rgb.b]++;
<TAB>}
<TAB>fclose(fp); /* ここで一旦ファイルを閉じる */
<TAB>if((fp=fopen("textdata", "w")) == NULL) exit(1); /* ファイルが開けなかった */
<TAB>fprintf(fp, "r,g,b,頻度");
<TAB>for(r=0; r<RGB_MAX; r++)
<TAB><TAB>for(g=0; g<RGB_MAX; g++)
<TAB><TAB><TAB>for(b=0; b<RGB_MAX; b++)
<TAB><TAB><TAB><TAB>fprintf(fp, "%.3d,%.3d,%.3d,%d,\n", r, g, b, data[r][g][b]);
<TAB>fclose(fp);
<TAB>return 0;
} /* <TAB>はタブ文字に置換してください、何度も荒らしみたいにごめんなさい。コンパイル通ったのが大変嬉しくて... */
0316デフォルトの名無しさん2005/08/28(日) 04:50:16
みなさんありがとうございます。
RGBαのαは無視してと今までいっていたのですができればRGBαをまとまりと
考えて出現頻度を求めていただけないでしょうか?わがままいってもうしわけありません
0317デフォルトの名無しさん2005/08/28(日) 04:56:34
作るのがあほらしくなったのでパス。>316
0318デフォルトの名無しさん2005/08/28(日) 05:01:53
うむ。完全にバカにしとるな。
0319デフォルトの名無しさん2005/08/28(日) 05:02:14
>>308
ありがとうございます。
動作を確認いたしました。

>return (long) r << 16 | (long) g << 8 | b;
この動作でαを除外したのですか?
無知ですみません
0320デフォルトの名無しさん2005/08/28(日) 05:03:44
>>317
>>318
すいません・・・。
上の方で4バイトずつのヒストグラムは難しいといわれたので自分で勝手に3バイトとしました。
それならなんとかなるのかなとおもったためです
すいませんでした。
0321デフォルトの名無しさん2005/08/28(日) 05:10:18
>>310
ありがとうございました。
0322デフォルトの名無しさん2005/08/28(日) 05:35:57
入力ファイルがメモリのサイズを越えないのであれば、四バイトの索引と
頻度のペアを作っていけば数えられるよ。
ただ、ヒストグラムの横軸をどうするのか?
出題ミスのような気がするから、まずやるべきは先生に問題を確認することなんだけど
なぁ……
0323デフォルトの名無しさん2005/08/28(日) 06:00:57
>>322
char、short、longと、配列サイズを変更して集計するとか。
0324デフォルトの名無しさん2005/08/28(日) 06:03:04
>>322
ありがとうございます。
308の if (count[i]) /* 全要素を出力するにはこの行を削除 */
で 削除して全要素を出力したのですが出力できなかったところを考えると
2の24畳でさえだめだったのですから2の32乗は無理そうですね。
ですので出現したものだけのヒストグラムを作ろうかなと考えております(出題ミスでないと考えた場合)
0325デフォルトの名無しさん2005/08/28(日) 06:09:16
この人わかってない。
0326デフォルトの名無しさん2005/08/28(日) 06:17:09
つか線形リストなり、ハッシュなりで実装すりゃええやん
どーいうデータが想定されてんのか知らんけどさ
どーせ頻度0の要素がほとんどだろ?
0327デフォルトの名無しさん2005/08/28(日) 06:22:58
固定長配列でO(n^2)なアルゴリズム。
0328デフォルトの名無しさん2005/08/28(日) 06:28:03
>>325
すいません・・・

>>326
TAが配布したデータでは
(要素数は2の24乗がある中使われていた要素は10000ちょっとでした)でした。

>>327
わかりません・・・。
0329デフォルトの名無しさん2005/08/28(日) 06:32:13
>>317
>>318
いいわけさせていただくと αの要素を調べていたら0か255でしたので
(RGBすべてが0だった場合αも0、RGBが何かしらの値を盛っていたらαは常に255だった)
のでαを省いたものといいました。
しかし、これでは他のデータですと汎用性がないというっことが考えられます
ですので後でRGBαをワンセットと考えて〜といってしまいました

みなさんにはいろいろしてもらっていたのに大変失礼なことをしてしまいました
本当にごめんなさい
0330デフォルトの名無しさん2005/08/28(日) 06:35:45
この後にデータ圧縮が控えているわけだが、データ構造はどうしたらよいか?
0331デフォルトの名無しさん2005/08/28(日) 06:40:23
オマエら朝から暇だな。

>>329
TAが配布したデータをupせよ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0332デフォルトの名無しさん2005/08/28(日) 06:50:18
>>330
データ圧縮は上でも推測されてたようにあるかもしれませんが、
ヒストグラムをつくってから考えたいと思います。
ためしにZIPで圧縮したら1.2Mが60kになったので関係ありそうな気がしますね・・・
>>331
TAから公開してはいけないとは言われいないデータなのですが、あまりにちゃんに慣れてない
ので怖いのでアップするのは勘弁してもらえないでしょうか?
0333デフォルトの名無しさん2005/08/28(日) 06:52:16
あと気づいたことが会って
TAからはRGBαという構成といわれたんですが
どうも調べるうちにαBGRになっているような気がします。
一般論として環境によってはデータが逆さまになることがあるとか
きいたことがあるようなないような・・・
0334デフォルトの名無しさん2005/08/28(日) 06:55:50
>>333
x86系はリトルエンディアン
0335デフォルトの名無しさん2005/08/28(日) 06:58:20
>>334
ありがとうございます
確かそのような名前でなにかあったことを記憶しております
0336デフォルトの名無しさん2005/08/28(日) 06:59:27
・・・人の話を聴かんやつだな。
そういうチェックもしたいからupしろというてる。
・・・てか、人を信用しようよ・・・。
0337デフォルトの名無しさん2005/08/28(日) 07:02:35
不満に思うなら答えないでいいじゃないか
0338デフォルトの名無しさん2005/08/28(日) 07:06:21
うむ。そのとおりだ。
0339デフォルトの名無しさん2005/08/28(日) 07:13:15
>>336
すいません。TAが所属している研究室は画像研究をしてる研究室で
受講しているだけの一学生に大切なデータを渡すとは思えないのですが、
なにか問題になるといやですのでアップは勘弁してください。
いろいろしていただいているのに沢山しつれないことをして申し訳ありません・・・。
0340デフォルトの名無しさん2005/08/28(日) 07:15:36
>>332
ハッシュはよくわからないけど、データが少ないんなら2分木とかで存在する値だけ読んでいくとか。
デフォルメしてかまわないんなら・・・普通に配列でいいか。

テキストファイルなら圧縮率高いですよ。
特に0が多い場合。
0341デフォルトの名無しさん2005/08/28(日) 07:22:54
うん。気張らなくていいと思う。
だらだら配列を線形探索。
0342デフォルトの名無しさん2005/08/28(日) 08:02:51
リトルエディアンの場合 RGBαでなくってあるαBGRになっていると思うのですが、
したの308さんのプログラムですとαBGをワンセットと考えて出現頻度がでるようになっていると
思います。BGRをワンセットと考えて出現頻度を出すにはどうしたらいいのでしょうか?
何度もすみません。

#include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}
0343デフォルトの名無しさん2005/08/28(日) 08:05:22
342を少し訂正いたします
>BGRをワンセットと考えて出現頻度を出すにはどうしたらいいのでしょうか?
をBGRαをワンセットとして出現頻度を出すにはどうしたらいのでしょううか?
に訂正させてください。BGRでも出現頻度がでるのならお願いします
0344デフォルトの名無しさん2005/08/28(日) 08:08:13
方法:そんなプログラムは捨てる
0345デフォルトの名無しさん2005/08/28(日) 08:35:00
針の先ほども自分で考える気は無いんだとさ。
0346デフォルトの名無しさん2005/08/28(日) 08:40:52
#include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) r << 24 | (long) g << 16 | (long) g << 8 | b;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}

ほらよ
0347デフォルトの名無しさん2005/08/28(日) 08:45:30
スマソ 346だけど普通に違ってるわこれ
0348デフォルトの名無しさん2005/08/28(日) 08:58:59
俺もよくなるが、なぜ書いた後になってすぐ気づくんだろう。
03493152005/08/28(日) 09:00:45
ども、起きぬけの>>315です。なんだか壮絶なことになっているようですね。
0350デフォルトの名無しさん2005/08/28(日) 09:03:49
return (long) r << 16 | (long) g << 8 | b;
これをいじればαBGからRGBになりそうなのですが、バスエラーが出たりと
よくわからなかったです。どうか教えていただけないでしょうか?
リトルエディアンのことを言い忘れていてすみません
03513152005/08/28(日) 09:05:58
リトルエンディアンでもそれぞれ1バイト長で確保しているならRGBalphaの並びではないんですか?
とにかくデータがalpha,R,G,Bの並びなのかどっちなのかはっきりさせる必要がありそうです。
0352デフォルトの名無しさん2005/08/28(日) 09:08:33
>>351
逆になってるっぽいって言ってるからRGBAlphaの1B*4で1セットじゃねーの
肝心のデータうpしてくれりゃそれで解決するんだがな
0353デフォルトの名無しさん2005/08/28(日) 09:18:13
私なりに調べてみたのですが、リトルエディアンだとバイナリダンプすると順序が逆になってでてくるそうです
データ自身はRGBαなのですがαBGRというふうに出て来るそうです
0354デフォルトの名無しさん2005/08/28(日) 09:28:27
352さんのいってらっしゃるので正しいかと思います
03553152005/08/28(日) 09:32:41
普通にメモリとって記録していったら....
17179869184Byte つまり、16777216MB、16384GBもメモリをとられることになるんですけど.....。
頻度はそれぞれunsigned char型に収まりきらないものでしょうか。
0356デフォルトの名無しさん2005/08/28(日) 09:33:11
(意訳)データをupするのが正しいかと思います
0357デフォルトの名無しさん2005/08/28(日) 09:35:32
そもそも要素数が半端じゃないな。
0358デフォルトの名無しさん2005/08/28(日) 09:36:28
まあ、今日は暇だから付き合いますけど。
0359デフォルトの名無しさん2005/08/28(日) 09:39:16
#include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) dummy = 0 | (long) b << 16 | (long) g << 8 | r;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}

これでおk?
0360デフォルトの名無しさん2005/08/28(日) 09:44:43
>>355
とりあえず値の範囲でも調べたら?
何通りあるかとか。
0361デフォルトの名無しさん2005/08/28(日) 09:46:08
みなさんありがとうございます

>頻度はそれぞれunsigned char型に収まりきらないものでしょうか。
データのサイズによるのですが 2の24乗必要と考えもらえると助かります
0362デフォルトの名無しさん2005/08/28(日) 09:52:35
私の勝手な考えなのですが308さんのプログラムでほとんど問題なく、ただ、308さんのだと
αBGのワンセットでの出現頻度になっているので
BGR(RGB)のワンセットでの出現頻度が出るようになればなと考えております
■ このスレッドは過去ログ倉庫に格納されています