2. 用到的一些函式
最近需要將matlab中的**轉為c**,主要依靠opencv3.1.0庫實現,於是在此記錄用到的一些操作,主要包括mat和一些函式的使用方法,希望可以方便後邊回顧。
與matlab中變數聯絡最為緊密的就是opencv中的mat型變數了,該變數是「影象的容器」,亦可視為矩陣對待。
using namespace cv //提前宣告
x =
(mat_<
double
>(3
,3)<<1,
2,3,
4,5,
6,7,
8,9)
;
file* fp;
fp =
fopen
("tar.txt"
,"r");
double points[
5000];
//定義足夠大的陣列
int n, k =0;
while(!
feof
(fp)
)fclose
(fp)
;mat tmp =
mat(k/3,
3, cv_64f, points)
;//由points矩陣建立n*3的矩陣tmp,其中n=k/3
tmp.at<
double
>(3
,3)=
1;//需要提前知道矩陣的元素型別,若型別不符會報錯
tmp.
col(0)
.copyto(a
(range(0
, length)
,range(12
,13))
);//tmp的第0列複製到a的第12列
mat b =
a(range:
:all()
,range(1
,3))
;//b是a的第1—2列(a從第0列數起)
tmp=mat:
:zeros(4
,4,cv_64f)
;//建立4*4的全0矩陣tmp,cv_64f指定了資料型別為double
假設a,b都是mat型變數且b已經指向了乙個矩陣,這個矩陣是記憶體中的一片記為c的區域,需要注意的是語句a=b並不會在記憶體中再開闢一塊內容與c一樣的d區域,而是讓a指向c區域,對a或b的操作都會改變c的內容,從而改變a,b的值,這就是有時為什麼要對矩陣進行複製操作的原因。
a.
mul(b)
//相當於matlab中的a.*b
invert
(b, tmp)
;//求b的逆,結果在tmp中
a*tmp;
//沒有matlab中的a/b,用a*b^-1來求
a*b.
inv();
//後來發現的另一種方法
a.t(
); //a的轉置
hconcat
(x, mat:
:ones
(length,
1, cv_64f)
, newx)
;//為矩陣x增加乙個全1列,結果在newx中
x = tmp.
clone()
;//tmp複製給x(記憶體中開闢新的區域)
tmp.
copyto(t
(range:
:all()
,range(1
,3))
);//tmp複製給t的第1-2列
tmp.
copyto
(t.colrange
(range(1
,3))
);//後來發現的另一種方法
svd:
:compute
(a, s, u, v)
;//a=u*s1*v,s是乙個向量,矩陣s1由向量s擴充而來
reduce
(m,sy,
0,cv_reduce_sum,cv_64f)
;//對m按行求和,資料型別為double,結果在sy中
cv:
:sort
(tmp, near,cv_sort_every_row + cv_sort_ascending)
;//對tmp的每行公升序排序,結果放到near中
pcacompute
(x, tmp, vx)
;//求x的主方向,結果在vx中,tmp中為一些相關結果,不需要的話可以忽略
————————————————————
參考文章:
1.2.
3.
Matlab從入門到精通(四)
student.test 99 56 96 87 67 69 87 76 92 student.name wu qing student.weight 68 student.height 1.72 student.num 2003214091 student.add school of civil ...
matlab學習筆記
一致化矩陣 z1 1 2 4 3 4 1 z2 1 2 2 5 6 1 b 0 1 q 3 z concur b,q 向量之和 x1 netsum z1,z2 向量之積 x2 netprod z1,z2 感知器神經網路,完成 或 的計算 err goal 0.001 max epoch 500 x ...
MATLAB學習筆記
1.自由探索之恢復 如果不小心關閉了當前路徑視窗 命令歷史記錄視窗或命令視窗,可以通過選單欄的 desktop 選單中 desktoplayout default 恢復。2.開啟簡單的圖形視窗 在命令視窗中的 後面輸入 funtool 並按回車鍵。3.注釋 命令列中的百分號 起注釋的作用,matla...