算法系列:杂项
?
尋路算法
http://blog.jobbole.com/71044/
貝葉斯
http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/
?
RSA
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://blog.jobbole.com/61872/
?
Copyright ? 1900-2016, NORYES, All Rights Reserved.
http://www.cnblogs.com/noryes/
歡迎轉載,請保留此版權聲明。
-----------------------------------------------------------------------------------------
?
?
旋轉字符串
http://www.cnblogs.com/bakari/archive/2012/09/09/2677155.html
十大算法
http://code.csdn.net/news/2820149
http://blog.csdn.net/v_JULY_v/article/details/6096981
?
C++ Socket編程步驟
2016-03-19 23:29 52人閱讀 評論(0) 收藏 舉報
分類: cpp(6)
http://www.cnblogs.com/Sniper-quay/archive/2011/06/22/2086636.html
多線程
2016-03-19 23:57 50人閱讀 評論(0) 收藏 舉報
分類: cpp(6)
http://blog.csdn.net/hitwengqi/article/details/8015646
?
?
通俗易懂的機器學習入門指導
2016-03-23 22:31 60人閱讀 評論(0) 收藏 舉報
分類: machine learning(10)
http://blog.163.com/zhoulili1987619@126/blog/static/353082012015613104243192/
機器學習入門資源不完全匯總
2016-03-23 22:37 53人閱讀 評論(0) 收藏 舉報
分類: machine learning(10)
http://ml.memect.com/article/machine-learning-guide.html#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5
?
Logistic Regression 模型簡介
2016-03-23 23:14 42人閱讀 評論(0) 收藏 舉報
分類: machine learning(10)
http://tech.meituan.com/intro_to_logistic_regression.html
斯坦福機器學習公開課
2016-03-24 00:17 66人閱讀 評論(0) 收藏 舉報
分類: machine learning(10)
http://blog.csdn.net/abcjennifer/article/category/1173803/3
字符串反轉
2016-03-24 00:55 37人閱讀 評論(0) 收藏 舉報
分類: algorithm(17)
http://www.cnblogs.com/bakari/archive/2012/09/09/2677155.html
聚類
2016-03-25 00:09 39人閱讀 評論(0) 收藏 舉報
分類: machine learning(10)
http://www.cnblogs.com/William_Fire/archive/2013/02/09/2909499.html
PAGERANK
2016-03-27 00:30 38人閱讀 評論(0) 收藏 舉報
分類: algorithm(17)
http://blog.jobbole.com/23286/
Fibonacci全面總結
2016-04-07 17:44 52人閱讀 評論(0) 收藏 舉報
分類: mathmatics(4)
版權聲明:Copyright ? 1990-2016, NORYES, All Rights Reserved.
目錄(?)[+]
參考資料https://en.wikipedia.org/wiki/Fibonacci_number#CITEREFBeckGeoghegan2010
大數定理
2016-06-26 23:32 15人閱讀 評論(0) 收藏 舉報
分類: mathmatics(4)
作者:魏天聞
鏈接:https://www.zhihu.com/question/24538086/answer/31627340
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?
?
# include <iostream>
# include <memory>
# include <cstring>
using namespace std;
class MyString {
private:
char *m_data;
public:
MyString();
MyString(const char* ptr);
MyString(const MyString& rhs);
~MyString();
MyString& operator=(const MyString& rhs);
MyString operator+(const MyString& rhs);
char operator[](const unsigned int index);
bool operator==(const MyString& rhs);
friend ostream& operator<<(ostream& output, const MyString &rhs);
};
//默認的構造函數
MyString::MyString() {
m_data = new char[1];
*m_data = '\0';
}
//使用const char* 來初始化
MyString::MyString(const char* ptr) {
if (NULL == ptr) {
m_data = new char[1];
*m_data = '\0';
} else {
int len = strlen(ptr);
m_data = new char[len + 1];
strcpy(m_data, ptr);
}
}
//拷貝構造函數
MyString::MyString(const MyString& rhs) {
int len = strlen(rhs.m_data);
m_data = new char[len + 1];
strcpy(m_data, rhs.m_data);
}
bool MyString::operator ==(const MyString& rhs) {
int result = strcmp(m_data, rhs.m_data);
if (0 == result)
return true;
else
return false;
}
//賦值操作符
MyString& MyString::operator =(const MyString& rhs) {
if (this != &rhs) {
delete[] m_data;
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data, rhs.m_data);
}
return *this;
}
//重載運算符+
MyString MyString::operator+(const MyString &rhs) {
MyString newString;
if (!rhs.m_data)
newString = *this;
else if (!m_data)
newString = rhs;
else {
newString.m_data = new char[strlen(m_data) + strlen(rhs.m_data) + 1];
strcpy(newString.m_data, m_data);
strcat(newString.m_data, rhs.m_data);
}
return newString;
}
//重載下標運算符
char MyString::operator [](const unsigned int index) {
return m_data[index];
}
//析構函數
MyString::~MyString() {
delete[] m_data;
}
//重載<<
ostream& operator<<(ostream& output, const MyString &rhs) {
output << rhs.m_data;
return output;
}
int main() {
const char* p = "hello,world";
MyString s0 = "hello,world";
MyString s1(p);
MyString s2 = s1;
MyString s3;
s3 = s1;
MyString s4 = s3 + s1;
bool flag(s1 == s2);
cout << s0 << endl;
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << flag << endl;
char result = s3[1];
cout << result << endl;
cout << s4 << endl;
return 0;
}
?
?
歐拉角
2016-07-19 15:52 310人閱讀 評論(0) 收藏 舉報
分類: graphics/image(21)
版權聲明:Copyright ? 1990-2016, NORYES, All Rights Reserved.
目錄(?)[+]
https://en.wikipedia.org/wiki/Euler_angles
?
四元數 001
2016-07-19 16:40 8人閱讀 評論(0) 收藏 舉報
分類: mathmatics(4)
目錄(?)[+]
?
Understanding Quaternions
?
?
?
矩陣行存儲、列存儲、左乘、右乘
2016-07-21 11:24 27人閱讀 評論(0) 收藏 舉報
分類: graphics/image(21)
版權聲明:Copyright ? 1990-2016, NORYES, All Rights Reserved.
列矩陣(column major)和行矩陣(row major)是數學上的概念,和電腦無關。它只是一套約定(convention),按照矢量和矩陣的乘法運算時,矢量是列矢還是行矢命名。
這里只說4x4矩陣。齊次矢量可以看成是一個1x4的矩陣,就是行矢;或者4x1的矩陣,就是列矢。
列矩陣變換矢量時,用矩陣乘以列矢量(M * v),如下。其中1、2、3為三個軸向矢量。
| x1 x2 x3 xt | | x |
| y1 y2 y3 yt | * | y |
| z1 y2 y3 zt | | z |
| 0 0 0 1 | | w |
列矩陣之間乘法組合時,組合順序為從右到左。例如依次做放縮S、旋轉R、平移T,則組合為T * R * S。
行矩陣變換矢量時,用行矢量乘以矩陣(v * M),如下。其中1、2、3為三個軸向矢量。
| x1 y1 z1 0 |
| x y z w | * | x2 y2 z2 0 |
| x3 y3 z3 0 |
| xt yt zt 1 |
行矩陣之間乘法組合時,組合順序為從左到右。例如依次做放縮S、旋轉R、平移T,則組合為S * R * T。
列優先存儲(column major storage)和行優先存儲(row major storage)是計算機上的概念,指多維數組的元素在內存中的排列順序。
對應到矩陣上,按內存地址順序編號,則列優先存儲的順序為
| 1 5 9 13 |
| 2 6 10 14 |
| 3 7 11 15 |
| 4 8 12 16 |
行優先存儲的順序為
| 1 2 3 4 |
| 5 6 7 8 |
| 9 10 11 12 |
| 13 14 15 16 |
對于效率差異,其實并沒有絕對區別,和處理器的指令設計有關,也和矩陣的主要使用方式有關。
在CPU上,一般是列矩陣用列優先存儲,行矩陣用行優先存儲,也就是矩陣major和存儲major一致。一來比較簡單清楚不容易犯錯,二來可以直接在矩陣中訪問三個軸矢量,三來在SSE優化時略有優勢,可以使用4個mul-add指令完成矩陣乘矢量。但最新的SSE指令集也加入了dot指令,所以勝負難料。而在GPU上,由于矩陣是以矢量序列方式存儲的,為了優化乘法速度,會顛倒存儲順序。不明白可以想想矩陣和矢量的乘法,可以拆解成4個矢量間點乘,點乘的操作數都在float4的矢量里就不用shuffle了。
決定選擇哪種模式,更多的是歷史原因。比如Maya、OpenInventor等雖然用的OpenGL,但使用的是行矩陣。OpenGL按著多數教科書習慣,用的列矩陣。而DirectX,沿襲了RenderMan等的習慣,用的行矩陣。
除此之外,也確實有個別采用了列矩陣但是行優先存儲的……原因嘛,C的數組是行優先,在代碼里寫矩陣常量當然是行優先比較直觀。大家可以找找那些圖形庫、圖形引擎用了不一致的模式。
列矩陣列優先存儲的內存數據,其實和行矩陣行優先存儲的內存數據是一樣的,都是
[ x1 y1 z1 0 x2 y2 z2 0 x3 y3 z3 0 xt yt zt 1 ]
這也是Maya、OpenInventor用行矩陣而不需要擔心效率的原因,不需要轉置,可以直接傳給OpenGL。
?
?
另外,澄清一個經?;煜母拍?#xff1a;左乘(left multiplication, pre-multication)和右乘(right multiplication, post-multication)
這里的左右、pre/post,指的是矢量和矩陣相乘時,矢量的位置。對標量和矩陣相乘時,指標量的位置。
混淆的原因,是有個別組織、個人用其指代矩陣在乘法中的位置,導致正好相反的命名。比如Maya里的pre-multiplication和post-multiplication。
?
OpenGL 1.0 標準指定時,圖形軟件多使用左乘行矩陣行優先存儲,包括OpenGL的前身IrisGL,而非軟件領域則多用右乘列矩陣。(其實今天也是一樣。)標準制定者希望消除這種差別,以便初學者不容易誤解。但是,他們也不希望給已有的圖形軟件帶來麻煩。于是,利用矩陣本身的行列和存儲順序兩者獨立這一特點,設計了一個trick的定義:右乘列矩陣列優先存儲。這樣存儲的矩陣的內存數據布局和左乘行矩陣行優先存儲一模一樣,原有的數學庫和使用方式不需要做任何更改。這樣,兩個目標就都實現了。
但是,事與愿違,這種設計在初學者中導致了更多的誤解。很多初學者試圖在給GL傳矩陣時先轉置,反而得不到正確的結果。而且C的數組是行優先存儲,按書面排版寫出的數組其實是列矩陣行優先存儲。
PS:行矩陣、列矩陣(row major, column major)這兩個詞其實被用得比較亂,有時也被用來指行列優先存儲順序。左乘右乘更能體現這種矩陣本身的差別,當然除了Maya里這倆詞是反著用的。
?
DX的行矩陣和GL的列矩陣的內存布局是一模一樣的,所以通用數學庫沒有任何困難,直接用就行了。唯一例外的是投影矩陣,因為投影空間范圍定義不同(還有一點額外表達形式的要求差異),所以需要兩套實現。
某些偏執的人非要用行優先存儲的列矩陣,認為這樣才符合數學習慣,這就是自找麻煩了。
?
轉載于:https://www.cnblogs.com/noryes/p/5716675.html
總結
- 上一篇: 分布式系统之CAP理论
- 下一篇: grunt的学习和使用