Generate Circulant Matrix From Given Array In C++

A circulant matrix functions as a square arrangement that shows each subsequent row as a rotatory move of its preceding row. These matrices find applications in signal processing as well as in coding theory and numerical analysis.

Definition of a Circulant Matrix:

The mathematical structure of circulant matrices comes from square matrix formats, which produce each successive row through right circular shifts from preceding rows.

Given an array:

Example

C= [  c0 c1 c2 ......  cn-1
    cn-1 c0 c1........ cn-2
    cn-2 cn-1 c0 ......cn-3
    cn-3 cn-2 cn-1.....cn-4
     .    	.   	. 	........  .
     .    	.   	. 	........  .
     c1  c2  c3 ....... c0]

Properties of the Circulant matrix:

Several properties of the Circulant Matrix in C++ are as follows:

  • Structure: Any circulant matrix achieves full determination through the inspection of its initial row. When we rotate the rows of the matrix, it does not experience any modifications.
  • Eigenvalues and Eigenvectors: A circulant matrix allows eigenvalue calculations through Discrete Fourier Transform (DFT) methods.
  • Fast Computation: Using Fast Fourier Transform (FFT) to perform operations with circulant matrices allows us to enhance computational efficiency from O(n^2) to O(n log n).
  • Diagonalization: Every circulant matrix is diagonalizable by the Fourier matrix F: C=FDF^−1 where D is a diagonal matrix containing the eigenvalues.
  • Linear Combinations: The set of all n×n circulant matrices forms a commutative algebra under matrix addition and multiplication.
  • Commutativity: Circulant matrices commute under multiplication: c1 c2 = c2 c1 for any two circulant matrices of the same size.
  • Inversion: A circulant matrix is invertible if and only if none of its eigenvalues are zero. The inverse of a circulant matrix (if it exists) is also circulant.
  • Algorithm:

The procedure for building a circulant matrix from a given array of sizes includes the following steps:

  • Initialize an empty matrix.
  • The original array serves as the first entry of the output matrix.
  • The right-side movement of rows occurs cyclically between all subsequent rows.
  • Example:

The following C++ function generates a circulant matrix from a given array:

Example

// Function to generate a circulant matrix
vector<vector<int>> generateCirculantMatrix(const vector<int>& arr) {
    int n = arr.size(); // Get the size of the matrix
    vector<vector<int>> circulantMatrix(n, vector<int>(n)); // Initialize matrix
    // Constructing the circulant matrix using cyclic shifting
    for (int i = 0; i < n; i++) { // Row iteration
        for (int j = 0; j < n; j++) { // Column iteration
            circulantMatrix[i][j] = arr[(j - i + n) % n]; // Cyclic right shift using modulo
         }
    }
    return circulantMatrix;
}
// Function to display the matrix
void printMatrix(const vector<vector<int>>& matrix) {
    for (const auto& row : matrix) {
        for (int val: row) {
            cout << val << " ";
        }
        cout << endl;
    }
}
int main() {
    int n;
    cout << "Enter the size of the array: ";
    cin >> n; // Taking size input
    vector<int> inputArray(n);
    cout << "Enter " << n << " elements: ";
    for (int i = 0; i < n; i++) {
        cin >> inputArray[i]; // Taking dynamic input
    }
    // Generate and display circulant matrix
    vector<vector<int>> circulantMatrix = generateCirculantMatrix(inputArray);
    cout << "Circulant Matrix:" << endl;
    printMatrix(circulantMatrix);

    return 0;
}

Output:

Explanation of the Code:

  1. Taking Dynamic Input:
  • The program asks the user to specify the array size which is (n).
  • The application allows the user to input dynamic elements that match the size (n).
  1. Function generateCirculantMatrix:

Constructs an n×n matrix.

Uses modular arithmetic:

arr[(j−i+n)%n]

  • (j - i): Moves elements left.
  • +n: Ensures non-negative index.

The code consumes cyclic shifts through the % n operation to wrap around the endpoints.

  1. Function printMatrix:

The program loops through all elements within the matrix and displays their values.

  1. main Function:
  • Takes size input (n).
  • Takes array input dynamically.
  • The program invokes the circulant matrix function and displays its output.
  • Applications of Circulant Matrices:

Numerous industries use circulant matrices for multiple applications in their operations:

  • Signal Processing: Signal Processing relies on circulant matrices to run convolution procedures as well as filtering methods that are especially useful in handling images and audio formats.
  • Fast Fourier Transform (FFT): The Fast Fourier Transform (FFT) benefits from the computational efficiency of circulant matrices during spectral analysis operations.
  • Cryptography: Cryptography deploys circulant matrices to develop secure encryption approaches together with error-correcting code frameworks.
  • Graph Theory: The theory of graphs serves to develop circulant models that find use in designing communication network systems and network designs.
  • Machine Learning: Machine Learning techniques rely on circulant matrices for conducting feature transformation and dimensionality reduction operations.
  • Numerical Linear Algebra: Numerical Linear Algebra utilizes efficient solutions for systems containing structured matrices including Toeplitz along with circulant systems.
  • Conclusion:

In conclusion, circulant matrices operate as a core concept that serves multiple scientific purposes across engineering mathematics and computer science . These matrices offer efficient computational processing across multiple domains, which include signal processing together with machine learning and numerical analysis. The use of C++ allows developers to both construct and operate on circulant matrices thus transforming them into essential practical problem-solving tools.

Input Required

This code uses input(). Please provide values below: