基於C++的circshift 函式詳解
阿新 • • 發佈:2018-12-21
函式講解
circshift函式是matlab中表示迴圈移位的函式,呼叫形式如下:B= circshift(A,K,m);
輸入引數解釋如下:
-
A表示待移位的向量或矩陣;
-
K表示所移位數,可以是數字,也可以是二維陣列,若是數字則可以和m協同作用來決定是行移位還是列移位。
-
m當K是數字時,m用來決定是行移位還是列移位。預設m是1,當m=1時表示列移位,當m=2時表示行移位
演示示例
假設A是一個3*#的陣列,其具體如下所示:
若B=circshif(A,1)時,結果如下:
當B=circshif(A,-1)時,結果如下:
總結
- 該函式實現矩陣迴圈移位
- 輸入:矩陣a,要以移動的維度
- 輸出:移位後的矩陣
- downshift>0,下移,downshift<0上移,rightshift>0右移 rightshift<0左移
- 正數表示右(下)迴圈移位,負數表示左(上)迴圈移位。
實現程式碼
(1)三個引數,影象的型別為Mat
void circshift(Mat& src, int downshift, int rightshift) { //兩次%一定能化成正數餘數 downshift = ((downshift%src.rows) + src.rows) % src.rows; //兩次%一定能化成正數餘數 rightshift = ((rightshift%src.cols) + src.cols) % src.cols; Mat dst = Mat::zeros(src.size(), src.type()); //對行進行變化 for (int i = 0; i<src.rows; i++) { int newrow = (i + downshift) % src.rows; //對列進行變換 for (int j = 0; j<src.cols; j++) { int newcolumn = (j + rightshift) % src.cols; dst.at<double>(newrow, newcolumn) = src.at<double>(i, j); } } //形成最終結果 dst.copyTo(src); }
(2)兩個引數,影象型別為Matrix
Matrix Matlab2c::circshift(Matrix& a,int downshift) //n為正順時針,n為負時針 { downshift = ((downshift%a.row)+a.row)%a.row; //兩次%一定能化成正數餘數 Matrix p(a.row,a.column); for (int i=0;i<a.row;i++) { int newrow=(i+downshift)%a.row; for (int j=0;j<a.column;j++) p(newrow,j) = a(i,j); } return p; }
(3)三個引數,影象型別為Matrix
Matrix Matlab2c::circshift(Matrix& a,int downshift,int rightshift)
{
downshift = ((downshift%a.row)+a.row)%a.row; //兩次%一定能化成正數餘數
rightshift = ((rightshift%a.column)+a.column)%a.column; //兩次%一定能化成正數餘數
Matrix p(a.row,a.column);
for (int i=0;i<a.row;i++)//先行變
{
int newrow=(i+downshift)%a.row;
for (int j=0;j<a.column;j++)
{
int newcolumn=(j+rightshift)%a.column;
p(newrow,newcolumn) = a(i,j);
}
}
return p;
}
(4)三個引數,影象型別為CMatrix
CMatrix Matlab2c::circshift(CMatrix& a,int downshift) //n為正順時針,n為負時針
{
downshift = ((downshift%a.row)+a.row)%a.row; //兩次%一定能化成正數餘數
CMatrix p(a.row,a.column);
for (int i=0;i<a.row;i++)
{
int newrow=(i+downshift)%a.row;
for (int j=0;j<a.column;j++)
p(newrow,j) = a(i,j);
}
return p;
}
(5)三個引數,影象型別為CMatrix
CMatrix Matlab2c::circshift(CMatrix& a,int downshift,int rightshift)
{
downshift = ((downshift%a.row)+a.row)%a.row; //兩次%一定能化成正數餘數
rightshift = ((rightshift%a.column)+a.column)%a.column; //兩次%一定能化成正數餘數
CMatrix p(a.row,a.column);
for (int i=0;i<a.row;i++)//先行變
{
int newrow=(i+downshift)%a.row;
for (int j=0;j<a.column;j++)
{
int newcolumn=(j+rightshift)%a.column;
p(newrow,newcolumn) = a(i,j);
}
}
return p;
}