`

【测速】矩阵翻转

    博客分类:
  • C++
 
阅读更多
在微博中看到有人分享了篇文章“为什么转置512×512矩阵,会比513×513矩阵慢很多?”http://note.sdo.com/u/1557869253/n/sSPb5~k5HYUMLX0mU000QX
没仔细看原理,但与缓存的命中率有关。
今天写矩阵翻转的代码,突然想到这个问题。测了一下速度:

结论:新建一片内存,顺序访问其中的元素,速度比较快!!!在翻转中能快个两倍左右!!!(注:我的矩阵是行优先存储的)


有关代码如下(代码不完全):
	//水平翻转矩阵中的元素
	void flipHorizontally(){
		T tmp;
		//int halfHeight=height_row/2;
		int halfWidth=width_col/2;
		for (int r=0; r<height_row; r++) {
			for (int c=0; c<halfWidth; c++) {
				int c2=width_col-1-c;
				tmp=getValue(r,c);
				this->operator()(r,c)=this->operator()(r,c2);
				this->operator()(r,c2)=tmp;
			}
		}

	}

	//水平翻转矩阵中的元素
	Matrix flipHorizontallyNewMatrix(){
		Matrix flipped(height_row,width_col);
		int halfWidth=width_col/2;
		for (int r=0; r<height_row; r++) {
			for (int c=0; c<=halfWidth; c++) {
				int c2=width_col-1-c;
				flipped(r,c)=this->operator()(r,c2);
				flipped(r,c2)=this->operator()(r,c);
			}
		}
		return flipped;
	}

	//水平翻转矩阵中的元素
	Matrix flipHorizontallyNewMatrix2(){
		Matrix flipped(height_row,width_col);
		for (int r=0; r<height_row; r++) {
			for (int c=0; c<width_col; c++) {
				int c2=width_col-1-c;
				flipped(r,c)=this->operator()(r,c2);
			}
		}
		return flipped;
	}


	//垂直翻转矩阵中的元素
	Matrix flipVerticallyNewMatrix(){
		Matrix flipped(height_row,width_col);
		int halfHeight=height_row/2;
		for (int r=0; r<=halfHeight; r++) {
			for (int c=0; c<width_col; c++) {
				int r2=height_row-1-r;
				flipped(r,c)=this->operator()(r2,c);
				flipped(r2,c)=this->operator()(r,c);
			}
		}
		return flipped;
	}

	//垂直翻转矩阵中的元素
	Matrix flipVerticallyNewMatrix2(){
		Matrix flipped(height_row,width_col);
		for (int r=0; r<height_row; r++) {
			for (int c=0; c<width_col; c++) {
				int r2=height_row-1-r;
				flipped(r,c)=this->operator()(r2,c);
				//flipped(r2,c)=this->operator()(r,c);
			}
		}
		return flipped;
	}


	//垂直翻转矩阵中的元素
	void flipVertically(){
		T tmp;
		int halfHeight=height_row/2;
		for (int r=0; r<halfHeight; r++) {
			for (int c=0; c<width_col; c++) {
				int r2=height_row-1-r;
				tmp=getValue(r,c);
				this->operator()(r,c)=this->operator()(r2,c);
				this->operator()(r2,c)=tmp;
			}
		}

	}




测试用的代码如下(代码不完全):
        for (int n=10; n<1000; n+=33) {


            MatrixInt m(n,n);
            for (int i=0; i<m.getNumEl(); i++) {
                m(i)=i;
            }

            int testNum=10000/n*10000/n;
            Timer timer;

            for(int i=0; i<testNum; i++)
                m.flipVerticallyNewMatrix();
            long tv1=timer.getElapsedTimeAndRestart();

            for(int i=0; i<testNum; i++)
                m.flipVerticallyNewMatrix2();
            long tv2=timer.getElapsedTimeAndRestart();

			for(int i=0; i<testNum; i++)
				m.flipVertically();
			long tvInplace=timer.getElapsedTimeAndRestart();

            for(int i=0; i<testNum; i++)
                m.flipHorizontallyNewMatrix();
            long th1=timer.getElapsedTimeAndRestart();

            for(int i=0; i<testNum; i++)
                m.flipHorizontallyNewMatrix2();
            long th2=timer.getElapsedTimeAndRestart();

			for(int i=0; i<testNum; i++)
				m.flipHorizontally();
			long thInplace=timer.getElapsedTimeAndRestart();
			cout<<"矩阵大小: "<<m.height_row<<"行*"<<m.width_col<<"列"<<endl;
			cout<<"水平翻转耗时:方法1:  "<<th1<<";\t\t方法2:  "<<th2<<";\t\t原位翻转:  "<<thInplace<<endl;
			cout<<"垂直翻转耗时:方法1:  "<<tv1<<";\t\t方法2:  "<<tv2<<";\t\t原位翻转:  "<<tvInplace<<endl;
            cout<<endl;

        }



测试用结果如下:
矩阵大小: 10行*10列
水平翻转耗时:方法1:  566;		方法2:  340;		原位翻转:  410
垂直翻转耗时:方法1:  652;		方法2:  342;		原位翻转:  450

矩阵大小: 43行*43列
水平翻转耗时:方法1:  364;		方法2:  180;		原位翻转:  390
垂直翻转耗时:方法1:  425;		方法2:  178;		原位翻转:  434

矩阵大小: 76行*76列
水平翻转耗时:方法1:  361;		方法2:  188;		原位翻转:  402
垂直翻转耗时:方法1:  433;		方法2:  183;		原位翻转:  445

矩阵大小: 109行*109列
水平翻转耗时:方法1:  360;		方法2:  180;		原位翻转:  397
垂直翻转耗时:方法1:  411;		方法2:  174;		原位翻转:  440

矩阵大小: 142行*142列
水平翻转耗时:方法1:  357;		方法2:  176;		原位翻转:  406
垂直翻转耗时:方法1:  413;		方法2:  173;		原位翻转:  456

矩阵大小: 175行*175列
水平翻转耗时:方法1:  353;		方法2:  173;		原位翻转:  403
垂直翻转耗时:方法1:  412;		方法2:  171;		原位翻转:  452

矩阵大小: 208行*208列
水平翻转耗时:方法1:  359;		方法2:  176;		原位翻转:  408
垂直翻转耗时:方法1:  417;		方法2:  173;		原位翻转:  455

矩阵大小: 241行*241列
水平翻转耗时:方法1:  349;		方法2:  171;		原位翻转:  400
垂直翻转耗时:方法1:  411;		方法2:  170;		原位翻转:  449

矩阵大小: 274行*274列
水平翻转耗时:方法1:  346;		方法2:  173;		原位翻转:  400
垂直翻转耗时:方法1:  406;		方法2:  167;		原位翻转:  448

矩阵大小: 307行*307列
水平翻转耗时:方法1:  343;		方法2:  170;		原位翻转:  400
垂直翻转耗时:方法1:  402;		方法2:  168;		原位翻转:  443

矩阵大小: 340行*340列
水平翻转耗时:方法1:  360;		方法2:  174;		原位翻转:  420
垂直翻转耗时:方法1:  410;		方法2:  169;		原位翻转:  447

矩阵大小: 373行*373列
水平翻转耗时:方法1:  460;		方法2:  259;		原位翻转:  398
垂直翻转耗时:方法1:  512;		方法2:  261;		原位翻转:  443

矩阵大小: 406行*406列
水平翻转耗时:方法1:  456;		方法2:  262;		原位翻转:  403
垂直翻转耗时:方法1:  516;		方法2:  255;		原位翻转:  452

矩阵大小: 439行*439列
水平翻转耗时:方法1:  450;		方法2:  248;		原位翻转:  401
垂直翻转耗时:方法1:  500;		方法2:  249;		原位翻转:  445

矩阵大小: 472行*472列
水平翻转耗时:方法1:  453;		方法2:  269;		原位翻转:  402
垂直翻转耗时:方法1:  513;		方法2:  265;		原位翻转:  450

矩阵大小: 505行*505列
水平翻转耗时:方法1:  433;		方法2:  252;		原位翻转:  390
垂直翻转耗时:方法1:  489;		方法2:  249;		原位翻转:  436

矩阵大小: 538行*538列
水平翻转耗时:方法1:  440;		方法2:  247;		原位翻转:  398
垂直翻转耗时:方法1:  497;		方法2:  247;		原位翻转:  444

矩阵大小: 571行*571列
水平翻转耗时:方法1:  443;		方法2:  256;		原位翻转:  397
垂直翻转耗时:方法1:  496;		方法2:  248;		原位翻转:  440

矩阵大小: 604行*604列
水平翻转耗时:方法1:  439;		方法2:  252;		原位翻转:  402
垂直翻转耗时:方法1:  494;		方法2:  248;		原位翻转:  438

矩阵大小: 637行*637列
水平翻转耗时:方法1:  436;		方法2:  244;		原位翻转:  397
垂直翻转耗时:方法1:  488;		方法2:  242;		原位翻转:  432

矩阵大小: 670行*670列
水平翻转耗时:方法1:  427;		方法2:  243;		原位翻转:  384
垂直翻转耗时:方法1:  483;		方法2:  238;		原位翻转:  427

矩阵大小: 703行*703列
水平翻转耗时:方法1:  449;		方法2:  257;		原位翻转:  403
垂直翻转耗时:方法1:  527;		方法2:  260;		原位翻转:  459

矩阵大小: 736行*736列
水平翻转耗时:方法1:  432;		方法2:  246;		原位翻转:  395
垂直翻转耗时:方法1:  493;		方法2:  245;		原位翻转:  440

矩阵大小: 769行*769列
水平翻转耗时:方法1:  452;		方法2:  258;		原位翻转:  409
垂直翻转耗时:方法1:  518;		方法2:  256;		原位翻转:  458

矩阵大小: 802行*802列
水平翻转耗时:方法1:  434;		方法2:  248;		原位翻转:  392
垂直翻转耗时:方法1:  492;		方法2:  248;		原位翻转:  433

矩阵大小: 835行*835列
水平翻转耗时:方法1:  415;		方法2:  240;		原位翻转:  372
垂直翻转耗时:方法1:  466;		方法2:  234;		原位翻转:  416

矩阵大小: 868行*868列
水平翻转耗时:方法1:  427;		方法2:  247;		原位翻转:  388
垂直翻转耗时:方法1:  478;		方法2:  239;		原位翻转:  433

矩阵大小: 901行*901列
水平翻转耗时:方法1:  448;		方法2:  262;		原位翻转:  400
垂直翻转耗时:方法1:  499;		方法2:  251;		原位翻转:  449

矩阵大小: 934行*934列
水平翻转耗时:方法1:  422;		方法2:  248;		原位翻转:  380
垂直翻转耗时:方法1:  477;		方法2:  237;		原位翻转:  426

矩阵大小: 967行*967列
水平翻转耗时:方法1:  436;		方法2:  257;		原位翻转:  388
垂直翻转耗时:方法1:  493;		方法2:  248;		原位翻转:  438
分享到:
评论

相关推荐

    利用TeeChart5动态绘制不同循环嵌套的矩阵乘法测速折线图

    1.二维动态数组,编程实现N*N矩阵乘法,我用的随机数赋值,为的是测速方便,你也可以稍微改改手动赋值。 2.测试6种循环嵌套方式:yix,iyx,yxi,xyi,xiy,ixy.体现“运算时间vs矩阵阶数N”的变化趋势

    多普勒测速雷达测速误差

    ### 多普勒测速雷达测速误差分析 #### 一、引言 随着科技的发展,雷达测速技术已经成为一种重要的速度测量手段。多普勒测速雷达利用多普勒效应来测量目标的运动速度,具有高精度和实时性等特点。然而,在实际应用...

    eNetTest 网管内网单机测速工具

    eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速...

    电脑cpu测速工具

    本文将深入探讨“电脑CPU测速工具”及其核心功能,特别是在多线程环境下的性能测试。 标题提到的“电脑CPU测速工具”是一种专门用于测量处理器性能的软件应用。这类工具的主要任务是通过执行特定的计算任务来衡量...

    cesu.rar_matlab 测速_测速 matlab_测速仪_测速雷达程序_雷达 测速

    一个关于雷达测速的MATLAB仿真程序,FIR带通滤波器matlab 测速仪。

    自行车测速仿真_自行车测速仿真_测速仿真_仿真_protues测速_

    自行车测速仿真是一个在电子工程和计算机科学领域常见的实践项目,主要目的是通过模拟实际环境来测试和验证自行车的速度测量系统。在这个项目中,我们利用了Protues软件,这是一个强大的虚拟原型设计工具,广泛用于...

    平衡 - 霍尔测速_霍尔测速_测速程序_mealsk8_霍尔_霍尔测速_

    本文将深入探讨霍尔测速技术及其在“mealsk8”项目中的应用,同时会涉及到与单片机通信的相关程序设计。 首先,霍尔效应是一种物理现象,由美国物理学家埃德温·霍尔在1879年发现。当电流通过导体,并在垂直于电流...

    android网络测速app源代码

    【Android网络测速App源代码】是一个专门为Android平台设计的应用程序,用于测试设备的网络速度,包括上传和下载的速度。这个App不仅提供了基本的测速功能,还具有记录查询和结果保存到TXT文件的能力,同时结合了...

    脉冲雷达测速测距的matlab程序_雷达测速matlab_雷达matlab_雷达测距_雷达多普勒_脉冲雷达测速

    MATLAB(矩阵实验室)是一种强大的编程环境,广泛应用于信号处理、图像分析和数值计算等领域,非常适合进行雷达系统的研究与开发。 脉冲雷达工作原理: 脉冲雷达系统通过发射一系列短暂的电磁脉冲,这些脉冲在空间...

    雷达测速抓拍软件,卡口检测,路口测速雷达设置软件,可兼容海康

    雷达测速抓拍软件在交通安全领域扮演着至关重要的角色,主要应用于卡口检测和路口测速,以确保交通法规的执行和道路安全。本软件专为HT3000D高清测速仪设计,能够与海康等品牌的测试相机协同工作,提供精确的测速...

    局域网测速.rar

    局域网测速是网络管理中的一个重要环节,它涉及到如何评估和优化本地网络的性能。在局域网中,高效的数据传输速度对于共享文件、在线游戏、视频会议等活动至关重要。以下是一些关于局域网测速及其相关软件的详细知识...

    360测速单文件版

    【360测速单文件版】是一款专为网络速度测试设计的小巧工具,它集成了360安全公司的技术,旨在帮助用户快速、准确地了解自己的网络状况。这款软件的特点在于其轻量级的特性,仅包含少数几个文件,方便用户下载和使用...

    pd_radar_雷达代码_雷达测速_pd雷达测速_pd测速_

    【pd_radar_雷达代码_雷达测速_pd雷达测速_pd测速】 雷达技术是现代电子信息技术中的重要组成部分,广泛应用于军事、交通、气象等多个领域。在这个项目中,我们主要关注的是pd雷达(Pulse Doppler Radar)的测速...

    红外测速.zip

    红外测速技术是一种广泛应用在各种领域中的速度检测方法,它主要依赖于红外光的发射与接收来计算物体的运动速度。这项技术广泛应用于交通监控、工业自动化、体育竞赛计时等多个场景。本压缩包文件“红外测速.zip”...

    S7-200接近开关测速

    标题中的"S7-200接近开关测速"是指使用西门子S7-200系列PLC(可编程逻辑控制器)进行接近开关的测速应用。接近开关是一种非接触式的传感器,常用于检测物体的接近程度,尤其在工业自动化领域广泛应用。S7-200是...

    天翼测速专家装维人员使用手册和问题指南(手机、PDA、智能网关).docx

    《天翼测速专家装维人员使用手册和问题指南》是为网络速率测试提供的一份详细操作手册,主要适用于中国电信的装维人员,包括使用手机、PDA以及智能网关等设备进行测速的场景。这份手册旨在确保装维人员能够高效、...

    单片机小车测速

    在单片机应用领域,小车测速是一个常见的任务,尤其在智能小车或自动机器人设计中至关重要。本文将深入探讨如何使用单片机实现小车测速,并结合描述中的"新款光电测速传感器配套资料",来解析相关技术细节。 首先,...

    电机测速并显示

    标题“电机测速并显示”涉及的是电机控制领域的一个关键技术——速度测量和实时数据显示。在电机控制系统中,准确地获取电机的转速是至关重要的,因为它直接影响到系统的精度、稳定性和效率。以下是对这个主题的详细...

    测速原理(M法T法MT法).pdf

    电机测速是电机控制系统中的一个重要环节,其目的是实时准确地检测电机的运行速度,以便控制电机达到预期的运行状态。电机测速算法主要包括测频法(M法)、测周法(T法)和M/T法。接下来详细解释这三种算法的原理和...

Global site tag (gtag.js) - Google Analytics