1. 程式人生 > >基於C++的circshift 函式詳解

基於C++的circshift 函式詳解

函式講解

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;
}

參考網址: