矩阵的操作

矩阵的之字打印,顺时针旋转90,顺时针打印操作。。。

//题目描述
//
//对于一个矩阵,请设计一个算法,将元素按“之”字形打印。具体见样例。
//给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字。
//测试样例:
//[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], 4, 3
//返回:[1, 2, 3, 6, 5, 4, 7, 8, 9, 12, 11, 10]

//设置一个标志位或者分奇偶数即可。
#include <iostream>
using namespace std;
#include <vector>

class Printer {
public:
    vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
        // write code here
        vector<int> vc;
        for (int i = 0; i < n; i++)
        {
            if (i % 2 == 0)
            {
                for (int j = 0; j < m; j++)
                {
                    vc.push_back(mat[i][j]);
                }
            }
            else
            {
                for (int j = m - 1; j >= 0; j--)
                {
                    vc.push_back(mat[i][j]);
                }
            }
        }
        return vc;
    }
};

//题目描述
//
//有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
//给定一个NxN的矩阵,和矩阵的阶数N, 请返回旋转后的NxN矩阵, 保证N小于等于300。
//测试样例:
//[[1, 2, 3], [4, 5, 6], [7, 8, 9]], 3
//返回:[[7, 4, 1], [8, 5, 2], [9, 6, 3]]

#include <iostream>
using namespace std;
#include <vector>
//方法一:列变换->次对角线变换  或者  次对角线变换->列变换
//方法二:一列一列取,然后再倒着放
class Rotate {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        // write code here
        vector<vector<int> > res;
        for (int i = 0; i < n;i++)
        {
            vector<int> vc;
            for (int j = n - 1; j >= 0;j--)
            {
                vc.push_back(mat[j][i]);
            }
            res.push_back(vc);
            vc.clear();
        }
        return res;
    }

    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        // write code here
        vector<vector<int> > a(n, vector<int>(n));
        int i, j;
        for (i = 0; i < n; i++)
        for (j = n - 1; j >= 0; j--)
        {
            a[i][n - j - 1] = mat[j][i];
        }
        return a;
    }
};

//题目描述
//
//对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
//给定int矩阵mat, 以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
//测试样例:
//[[1, 2], [3, 4]], 2, 2
//返回:[1, 2, 4, 3]

class Printer {
    vector<int> vc;
public:
    void printCircle(vector<vector<int> > mat,int x1, int y1,int x2,int y2)  //定义一个打印一圈的函数
    {
        if (x1==x2&&y1==y2)
        {
            vc.push_back(mat[x1][y1]);
            return;
        }
        else if (x1==x2&&y1!=y2)
        {
            for (int y = y1; y <= y2;y++)
            {
                vc.push_back(mat[x1][y]);
            }
            return;   //跳出函数,不然可能继续执行下面的函数,重读数据。
        }
        else if (y1==y2&&x1!=x2)
        {
            for (int x = x1; x <= x2;x++)
            {
                vc.push_back(mat[x][y1]);
            }
            return;
        }
        for (int y = y1; y < y2;y++)
        {
            vc.push_back(mat[x1][y]);
        }
        for (int x = x1; x < x2;x++)
        {
            vc.push_back(mat[x][y2]);
        }
        for (int y= y2; y>y1;y--)
        {
            vc.push_back(mat[x2][y]);
        }
        for (int x = x2; x > x1;x--)
        {
            vc.push_back(mat[x][y1]);
        }
    }
    vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
        // write code here
        int startX = 0, startY = 0;
        int endX = n - 1, endY = m - 1;
        while (startX <= endX&&startY <= endY)
        {
            printCircle(mat, startX, startY, endX, endY);
            startX++;
            startY++;
            endX--;
            endY--;
        }
        return vc;
    }

    //方法二
    vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
        // write code here
        vector<int> vc;
        int startX = 0, startY = 0;
        int endX = n - 1, endY = m - 1;
        int i = 0, j = 0;
        while (startX<=endX&&startY<=endY)
        {
            if (startX==endX)
            {
                //for (int j = 0; j < endY-startX;j++) //错误
                for (; j <= endY; j++)
                {
                    vc.push_back(mat[startX][j]);
                }
                return vc;
            }
            if (startY==endY)
            {
                for (; i <= endX ;i++)
                {
                    vc.push_back(mat[i][startY]);
                }
                return vc;
            }
            //复制除第一行最后一个元素的所有第一行元素
            for (; j<endY; j++)
                vc.push_back(mat[i][j]);
            //复制除第一column最后一个元素的所有第一column元素
            for (; i<endX; i++)
                vc.push_back(mat[i][j]);
            //复制除last一行最后一个元素的所有元素
            for (; j>startX; j--)
                vc.push_back(mat[i][j]);
            //复制除第一lie最后一个元素的所有元素
            for (; i>startY; i--)
                vc.push_back(mat[i][j]);

            startX++;
            startY++;
            endX--;
            endY--;
            i++;
            j++;
        }
        return vc;
    }
};
时间: 2024-08-08 09:40:23

矩阵的操作的相关文章

OpenCV学习(3)--Mat矩阵的操作

CvMat的矩阵结构 1 typedef struct CvMat 2 { 3 //矩阵中元素的类型 4 int type; 5 //行数据长度 6 int step; 7 8 /* for internal use only */ 9 int* refcount; 10 int hdr_refcount; 11 12 //指向数据的指针 13 union 14 { 15 uchar* ptr; 16 short* s; 17 int* i; 18 float* fl; 19 double* d

图像处理之 opencv 学习---矩阵的操作

OpenCV的一些操作,如生成随机矩阵,高斯矩阵,矩阵相乘之类的 /*功能:说明矩阵的一些操作方法*/#include "cv.h"//该头文件包含了#include "cxcore.h"#include "highgui.h"#include <stdio.h>void PrintMat(CvMat *A); // 显示矩阵void GenRandn(CvMat *arr, int seed); // 生成正态分布的随机矩阵void

Numpy 对于矩阵的操作持续更新

>>> import numpy as np >>> a = np.random.randint(10,size=(5,5)) >>> a array([[0, 8, 3, 0, 2], [0, 6, 6, 6, 3], [0, 3, 6, 8, 7], [2, 6, 1, 4, 4], [4, 1, 5, 6, 4]]) 1. 数组切片 随机生成5x5的一个矩阵 提取矩阵第n列 >>> a[:,3] array([0, 6, 8,

关于矩阵的操作

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define ROW 3 5 #define COL 3 6 //#define P 2 7 8 void input(int array[ROW][COL]); 9 void output(int array[ROW][COL]); 10 11 void trans(int arr1[ROW][COL], int arr2[ROW][COL]); 12 13 void max_min(in

OpenGL中平移、旋转、缩放矩阵堆栈操作

在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷远的点,比如(1,0,0,0)就表示x轴上无穷远的点,因为1/0是无穷大,这里约定0/0=0. 例:点(1,1,1)将该向量平移变换(2,3,4)个单位,得到

python/numpy/tensorflow中,对矩阵行列操作,下标是怎么回事儿?

Python中的list/tuple,numpy中的ndarrray与tensorflow中的tensor. 用python中list/tuple理解,仅仅是从内存角度理解一个序列数据,而非数学中标量,向量和张量. 从python内存角度理解,就是一个数值,长度为1,并且不是一个序列: 从numpy与tensorflow数学角度理解,就是一个标量,shape为(),其轴为0: [1,2,3,4,5,6] 从python内存角度理解,就是1*6或者长度为6的一个序列: 从numpy与tensorf

c++处理矩阵操作:Eigen库初步学习使用

前言: Eigen 是一个线性算术的C++模板库,包括:vectors, matrices, 开源以及相关算法.功能强大.快速.优雅以及支持多平台,可以使用该库来方便处理一些矩阵的操作,达到类似matlab那样的快捷.现在已经发展到Eigen3了,目前最新版本为Eigen 3.1.2. Eigen使用预备工作: 首先到Eigen官网上下载Eigen源码包,下载后解压完直接放到自己平时软件所在的目录下,不需要安装.Eigen下载地址为:http://eigen.tuxfamily.org/inde

转载 matlab矩阵数组常用操作

一. length             返回矩阵最长维的的长度    ndims       返回维数          numel      返回矩阵元素个数size               返回每一维的长度,[rows,cols]=size(A) 矩阵块操作 1.repmat() 数组块状复制 2.blkdiag()对角块生成函数 3.kron()直积 二.矩阵元素的提取与替换 (1)提取 A(i, j) :矩阵 A 中,位于第 i 横列.第 j 直行的元素用冒号(:), 取出一整列

matlab_矩阵的灵活操作

矩阵的随心所欲的世界: 矩阵的生成[创建] 矩阵的扩充 矩阵的操作[访问.赋值.删减.变向.抽取] 矩阵的分块[划分子集] 1. 矩阵的生成 使用          功能1) 特殊字符 [ ]   直接输入构造数组2) zeros()函数   构造全0数组 2. 矩阵的扩充 使用 特殊字符 [ ]Example: 原矩阵A,需要扩充的元素B,CD = [A,B,C] 扩充列D = [A;B,C] 扩充行...[扩充符合矩阵的大小性质均可] 错误操作: A = [1,2] B = [1;2] C