久々にプログラミング
そろそろ大学の卒業研究もやばいので、ちゃんとプログラムを書いてみることにする。そもそも読みかけてた論文がさっぱり先に進めなくなってたのは、文章で書かれていることがよく分からなかったからなんだけど、著者のサイトとかでサンプルコードが見られることに気がついて(気がつくのが遅すぎ)、ようやく少しは先に進めるようになったところだ。
で、最終的な成果物としては、Rの関数にしたいところなんだけど、その前の実証的なサンプルコードをObjective-Cで書くことに。なぜ、Objective-Cかというと、やっぱりこういう機会でもないとなかなか実際に使ってみようとしないし、それじゃ慣れないしって感じで。perlで行列を扱うための二次元配列をどうやって動的に作れば良いのか分からなかったから(そんなもん調べろよって感じもするけど)ってのもある。いや、そもそもObjective-CでNSArrayでなんかする方が敷居は高いんだけど、どうせ調べながらやるんだったら、新しいチャレンジをしてみようか、と。「眼の前 現れる分岐点 選ぶのはもちろんハードウェイ」というヤツである。
いやぁ、でも時間ないからなぁ、最初からRで書いた方がいいかもしれん。いや「かもしれん」じゃなくて、絶対にそうだ。うん。今日はやれるところまでObjective-Cでやって、気が済んだら明日からは本気でRを使うことにしよう。
NSArrayで二次元配列を作る
今やりたいことは、あるfloatの一次元のNSArrayの配列をcountして、それがc個だったら、c×cのfloatの2次元配列を作ること。まぁ、floatであることは置いといて、(id)型でもなんでもいいし。
int c = [array count]; float[][] f = new float[c][c];
えーっと、絶対違う。C#入ってるよ。
あーっ、分かった。NSArrayじゃなくて、NSMutableArrayを使って、いちいち追加してけばいいんだ。でも、float使ってる時点で、NSMutableArrayにaddObjectするたびに、NSNumberにしなくちゃいけなくて、とても面倒だ。
int c = [array count]; NSMutableArray *floatArray=[[NSMutableArray alloc]init]; for(int i=0;i<c;i++){ NSMutableArray *tmpArray = [[NSMutableArray alloc]init]; for(int j=9;j<c;j++){ int d=-([array objectAtIndex:i]-[array objectAtIndex:j])^2; [tmpArray addObject: [NSNumber numberWithFloat: d]]; } [floatArray addObject:tmpArray]; }
うーむ。普通に、Cの二次元配列にした方が、取り出すときもobjectAtIndexとかしなくてもいいし、楽そうだ。
list<float> f = new list<float>;
とかできれば、確実にfloatの配列として扱えるけど、NSMutableArrayだと取り出す度にNSNumberとして受け取らないといけないから、微妙に面倒だな。