為了期末報告寫的 wiimote 動作辨識終於在今天有了初步成果。
放個 demo 上來...
http://wiki.jienew.twbbs.org/project:wiimote-gesture-recognition
在 Demo 標題下有連結。
接下來要打報告...來不及做實驗了orz
為了期末報告寫的 wiimote 動作辨識終於在今天有了初步成果。
放個 demo 上來...
http://wiki.jienew.twbbs.org/project:wiimote-gesture-recognition
在 Demo 標題下有連結。
接下來要打報告...來不及做實驗了orz
小時候玩動物棋,狗可以吃掉狼。童話故事也說牧羊犬可以擊退狼。但是最近看了一部電影,裡面的狼跟狗很像,或者是說裡面的狗跟狼很像...又勾起我的好奇心。
Anyway.. 狗跟狼有什麼不一樣? 查了學名才知道,原來狗就是狼,兩者是同一種生物,交配所生的的狼狗,仍具有生育能力。
同樣的情形出現在金魚身上,之前看到電視節目說金魚是由鯽魚演化而來,是演化的例子。但是,令人疑惑的是,物種的演化現在應該沒有實例才是...。
因此我又查了兩者的學名,果然跟狗一樣,金魚就是鯽魚,兩者是同種生物,可以交配產生有生育能力的後代。
這兩個例子可以看出一個演化的難題:在自然環境雜交的情況下,基因的變異,應該是比人工育種的情況下更難保留。那麼,既然經過長期人工育種造成變異,也無法產生新種生物,在自然環境豈非更不可能產生新物種?
回想起之前動物園的河口鱷跟尼羅河鱷的區分事件,我又查了維基百科,發現兩者學名不同,所以是不同種生物,沒記錯的話,這表示兩者是不能交配的。即使兩種生物差別不大。
這個例子可讓人想到物種演化的另一個難題:假設一個新物種誕生了,他能夠繁衍後代嗎?
這情況類似鱷魚,很相似卻不同種,而無法交配產生後代。除非同時產生同種一公一母,但機率太低,可以說是不可能的。
兩個難題為獨立事件,機率相乘,自然演化出新物種的機率,將會低於不可能乘以不可能。
Referencehttp://en.wikipedia.org/wiki/Dog
http://en.wikipedia.org/wiki/Wolf
http://en.wikipedia.org/wiki/Carassius_auratus
http://en.wikipedia.org/wiki/Crucian_carp
根據林舒教授的 Error Control Coding 一書定義的 Convolution Code 所撰寫的 C++ Library,可以根據任意的(n,k,m) 以及 g vectors 產生 encoder / decoder 來模擬編碼解碼。使用 Viterbi Algorithm。
p.s. 演算法不確定是否正確,尤其 decoder 仍無法判斷 code 在編碼時何時開始補 0,可能誤判。
是我誤判= =" ... 演算法是對的
今天初見 Tiddly Wiki,覺得實在滿酷的...原來JavaScript可以這樣玩。
不過現在瀏覽器都讓他不警告JavaScript存取檔案......有點擔心XD
vector 新增/刪除元素會導致 iterator 失效,此時不該再對其 iterator 做 dereference ,否則產生 runtime error。
使用 list 可保證 iterator 不失效,但 iterator 前後關係仍會改變。此外 list 不支援像 aList[i] 這樣直接用 index 存取其中的元素。
WoW!
#include <iostream>
int main(void){
int i=6,j=5,k=4;
int ****threeDimensionArr;// 4 stars! for 3D
threeDimensionArr = new int ***[i];
for(int i_i=0; i_i<i; ++i_i){
threeDimensionArr[i_i] = new int **[j];
for(int j_i=0; j_i<j; ++j_i){
threeDimensionArr[i_i][j_i] = new int *[k];
for(int k_i=0; k_i<k; ++k_i){
threeDimensionArr[i_i][j_i][k_i]
= new int(i_i*j_i*k_i);
std::cout
<< *threeDimensionArr[i_i][j_i][k_i]<<"\t";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
//free memory
for(int i_i=0; i_i<i; ++i_i){
for(int j_i=0; j_i<j; ++j_i){
for(int k_i=0; k_i<k; ++k_i){
delete threeDimensionArr[i_i][j_i][k_i];
}
delete [] threeDimensionArr[i_i][j_i];
}
delete [] threeDimensionArr[i_i];
}
}
It's legal to get reference of dynamical allocated object:
std::vector<double> *vec = new std::vector<double>(5);
std::vector<double> &vec0Ref = *vec;
Use it:
#include <iostream>
#include <vector>
int main(){
size_t *n = new size_t;
std::cin >> *n;
std::vector<double> *vec = new std::vector<double>[*n];
// No error when vec is Pointer to Nothing! (*n == 0/1)
// It is dangerous using dynamic array...
std::vector<double> &vec0Ref = vec[0];
std::vector<double> &vec1Ref = vec[1];
double *a = new double;
std::cin >> *a;
vec0Ref.push_back(*a); //runtime-error when *n <= 0
std::cout << vec0Ref[0] << std::endl;
vec1Ref.push_back(*a); //runtime-error when *n <= 1
std::cout << vec1Ref[0] << std::endl;
}
Note:
會想到要拿到動態物件的 reference,是因為想要在物件建立後使用 array of references 取代 array of pointers ,用來放 sorting 的結果或做 mapping。但發現 It's illegel!
reference 並不能用來作為 array 或 container 的元素。基本上,reference 並不是物件,因此沒有辦法複製它,或改變其內容(指reference本身);其意義只是物件的別名。在JAVA/C#中的意義又不太一樣了;reference 感覺像是 const pointer。
當我們要對已存在的數個物件做 mapping,sorting 之類的動作,只能使用 array of pointers 來避免複製物件。之前會想要使用 reference 是因為書上說使用 reference 比 pointer 自然,也錯把 reference 視作 const pointer。(以前學JAVA= =)然而在這種情況下,使用 array of pointers 才是合理且正確的用法。
Another Test:
#include <iostream>
int main(){
//existing objects
int a=1, b=2;
int arr[2] = {a,b}; // correct
//error: declaration of `refs' as array of references
int &refs[2] = {a,b}; //error!
//array of pointers to integer
int *ptrs[2] = {&a,&b}; // correct
//reference of arr[2]
int (&ref)[2] = arr; // correct
//pointer to arr[2]
int (*ptr1)[2] = &arr; // correct
//assign "array" to "pointer to array"
int (*ptr2)[2] = arr; // error!
//pointer to first element of array
int *ptr3 = arr; // correct
std::cout <<"arr="<<arr<<" arr[1]="<<arr[1]<< std::endl
<<"ref="<<ref<<" ref[1]="<<ref[1]<<std::endl
<<"ptr1="<<ptr1<<" *ptr1="<<*ptr1
<<" (*ptr1)[1]="<<(*ptr1)[1]<<std::endl
<<"ptr3="<<ptr3<<" ptr3[1]="<<ptr3[1]<<std::endl;
std::cout <<"sizeof(arr)="<<sizeof(arr)<<std::endl
<<"sizeof(ref)="<<sizeof(ref)<<std::endl
<<"sizeof(ptr1)="<<sizeof(ptr1)<<std::endl
<<"sizeof(*ptr1)="<<sizeof(*ptr1)<<std::endl
<<"sizeof(ptr3)="<<sizeof(ptr3)<<std::endl;
}
將錯誤去掉後的執行結果:
arr=0012FF5C arr[1]=2
ref=0012FF5C ref[1]=2
ptr1=0012FF5C *ptr1=0012FF5C (*ptr1)[1]=2
ptr3=0012FF5C ptr3[1]=2
sizeof(arr)=8
sizeof(ref)=8
sizeof(ptr1)=4
sizeof(*ptr1)=8
sizeof(ptr3)=4
可見 array of reference 不合法。
此外,雖然 ptr3 跟 arr 幾乎等效,ptr3 其實還是 pointer to int(arr[0]) 而非 array name。而 ptr1 是 pointer to arr,因此*ptr1 就是 arr。
Note:
The elements of a dynamically allocated array can be initialized only to the default value of the element type. The elements cannot be initialized to separate values as can be done for elements of an array variable.
To initialize elements,
method 1:
std::cin >> n; std::vector<int> **vec = new std::vector<int> *[n]; for (int i=0;i<n;i++) //initialize each vector vec[i]=new std::vector<int>(i); // use first vector vec[0]->push_back(something);
method 2:
std::cin >> n; // vectors are initialized by default constructor std::vector<int> *vec = new std::vector<int>[n]; for (int i=0;i<n;i++) // change size of each vector (vec+i)->resize(i); // equivalent to vec[i].resize(i) // use first vector vec[0].push_back(something);