zoukankan      html  css  js  c++  java
  • C++实现矩阵的转置

    矩阵的转置

    转置用一维数组描述的二维矩阵,类中实现,可拆解出来。如若是二维数组的转置。可以考虑二维转一维再转置。。。
    当然,你愿意的话。。。(数据结构、算法与应用C++描述第七章习题)

    习题汇总

    matrix类

    //matrix.h
    template<class T>
    class matrix
    {
        friend std::ostream& operator<<
    		(std::ostream& out, const matrix<T>& theMatrix);
    public:
        matrix(int theRows = 0, int theColumns = 0);
        matrix(const matrix<T>& theMatrix);
        ...
        matrix<T> tranpose();
        T& operator() (int i, int j) const;//类似数学中的访问
        ...
    
    private:
        int rows, columns;
        T* element;
    };
    
    template<class T>
    matrix<T>::matrix(int theRows, int theColumns)
    {//构造函数
    	if (theRows < 0 || theColumns < 0)
    		throw illegalParameterValue("Rows and columns must be >= 0");
    	if ((theRows == 0 || theColumns == 0)
    		&& (theRows != 0 || theColumns != 0))
    		throw illegalParameterValue
    		("Either both or neither rows and columns should be zero");
    
    	rows = theRows;
    	columns = theColumns;
    	element = new T[rows * columns];
    }
    
    template<class T>
    matrix<T>::matrix(const matrix<T>& theMatrix)
    {//复制构造
    	rows = theMatrix.rows;
    	columns = theMatrix.columns;
    	element = new T[rows * columns];
    	std::copy(theMatrix.element, theMatrix.element + rows * columns, element);
    }
    

    转置实现

    template<class T>
    matrix<T> matrix<T>::tranpose()
    {//矩阵转置
        matrix<T> w(columns, rows);
        //用i遍历完一维数组,利用除法和求余锁定步长
        for (int i = 0; i < rows * columns; ++i)
              w.element[i / columns + rows * (i % columns)] = element[i];
        return w;
    }
    
    //官方答案
    template<class T>
    void matrix<T>::transpose(matrix<T>& b)
    {// Set b to be the transpose of *this.
       // create result matrix
       b.theRows = theColumns;
       b.theColumns = theRows;
       delete [] b.element;
       b.element = new T [theRows * theColumns];
    
       // copy from this->element to b.element
       int ct = 0;  // next element to move into the transpose
       for (int i = 1; i <= theRows; i++)
          for (int j = 1; j <= theColumns; j++)
             b.element[(j - 1) * theRows + i - 1] = element[ct++];
    
    }
    

    测试

    #include <iostream>
    #include "matrix.h"
    
    using namespace std;
    int main()
    {
        try
        {
            matrix<int> x(3, 2), y, z;
            int i, j;
            for (i = 1; i <= 3; i++)
                for (j = 1; j <= 2; j++)
                    x(i, j) = 2 * i + j;
            cout << "Initialized x(i,j) = 2*i + j" << endl;
            cout << "x(3,1) = " << x(3, 1) << endl;
            cout << "x is" << endl;;
            cout << x << endl;
    
            y = x.tranpose();
            cout << y << endl;
        }
        catch (...) {
            cerr << "An exception has occurred" << endl;
        }
    
        return 0;
    }
    

    输出

    Initialized x(i,j) = 2*i + j
    x(3,1) = 7
    x is
    3  4
    5  6
    7  8
    
    3  5  7
    4  6  8
    
  • 相关阅读:
    Node的Buffer
    node中定时器的“先进”用法
    比较setImmediate(func),setTimeout(func),process.nextTick(func)
    node.js事件触发
    node.js express的安装过程
    ”靠谱的C#“单例模式
    JS性能消耗在哪里?
    如何建立索引
    优化之sitemap+RSS
    优化のzencart URL &zenid=.....
  • 原文地址:https://www.cnblogs.com/ysjcqs/p/tranpose.html
Copyright © 2011-2022 走看看