前言

前段时间我问了一个关于Matlab与Python性能的问题(Performance: Matlab vs Python).我很惊讶Matlab比Python更快,特别是在meshgrid中.在讨论这个问题时,有人指出我应该使用Python中的包装器来调用我的C代码,因为C代码也可供我使用.我在C,Matlab和Python中有相同的代码.

在这样做时,我再次惊讶地发现Matlab在矩阵汇编和计算中比C更快.我有一个稍微大一点的代码,我正在研究一段矩阵向量乘法.较大的代码在多个实例处执行这样的乘法.总体而言,C中的代码比Matlab快得多(因为Matlab中的函数调用有开销等),但Matlab似乎在矩阵向量乘法(底部的代码片段)中表现优于C语言.

结果

下表显示了组装内核矩阵所需的时间与将矩阵与向量相乘所需的时间的比较.结果编译为矩阵大小N×N,其中N在10,000到40,000之间变化.哪个不是那么大.但有趣的是,Mat获得的N越大,表现越好. Matlab的总​​时间快3.8到5.8倍.此外,它在矩阵组装和计算中也更快.

___________________________________________

|N=10,000 Assembly Computation Total |

|MATLAB 0.3387 0.031 0.3697 |

|C++ 1.15 0.24 1.4 |

|Times faster 3.8 |

___________________________________________

|N=20,000 Assembly Computation Total |

|MATLAB 1.089 0.0977 1.187 |

|C++ 5.1 1.03 6.13 |

|Times faster 5.2 |

___________________________________________

|N=40,000 Assembly Computation Total |

|MATLAB 4.31 0.348 4.655 |

|C++ 23.25 3.91 27.16 |

|Times faster 5.8 |

-------------------------------------------

在C中有更快的方法吗?我错过了什么吗?我知道C正在使用for循环,但我的理解是Matlab也将在meshgrid中做类似的事情.

代码片段

Matlab代码:

%% GET INPUT DATA FROM DATA FILES ------------------------------------------- %

% Read data from input file

Data = load('Input/input.txt');

location = Data(:,1:2);

charges = Data(:,3:end);

N = length(location);

m = size(charges,2);

%% EXACT MATRIX VECTOR PRODUCT ---------------------------------------------- %

kex1=ex1;

tic

Q = kex1.kernel_2D(location , location);

fprintf('\n Assembly time: %f ', toc);

tic

potential_exact = Q * charges;

fprintf('\n Computation time: %f \n', toc);

类(使用meshgrid):

classdef ex1

methods

function [kernel] = kernel_2D(obj, x,y)

[i1,j1] = meshgrid(y(:,1),x(:,1));

[i2,j2] = meshgrid(y(:,2),x(:,2));

kernel = sqrt( (i1 - j1) .^ 2 + (i2 - j2) .^2 );

end

end

end

C代码:

编辑

使用带有以下标志的make文件进行编译:

CC=g++

CFLAGS=-c -fopenmp -w -Wall -DNDEBUG -O3 -march=native -ffast-math -ffinite-math-only -I header/ -I /usr/include

LDFLAGS= -g -fopenmp

LIB_PATH=

SOURCESTEXT= src/read_Location_Charges.cpp

SOURCESF=examples/matvec.cpp

OBJECTSF= $(SOURCESF:.cpp=.o) $(SOURCESTEXT:.cpp=.o)

EXECUTABLEF=./exec/mykernel

mykernel: $(SOURCESF) $(SOURCESTEXT) $(EXECUTABLEF)

$(EXECUTABLEF): $(OBJECTSF)

$(CC) $(LDFLAGS) $(KERNEL) $(INDEX) $(OBJECTSF) -o $@ $(LIB_PATH)

.cpp.o:

$(CC) $(CFLAGS) $(KERNEL) $(INDEX) $< -o $@

`

# include"environment.hpp"

using namespace std;

using namespace Eigen;

class ex1

{

public:

void kernel_2D(const unsigned long M, double*& x, const unsigned long N, double*& y, MatrixXd& kernel) {

kernel = MatrixXd::Zero(M,N);

for(unsigned long i=0;i

for(unsigned long j=0;j

double X = (x[0*N+i] - y[0*N+j]) ;

double Y = (x[1*N+i] - y[1*N+j]) ;

kernel(i,j) = sqrt((X*X) + (Y*Y));

}

}

}

};

int main()

{

/* Input ----------------------------------------------------------------------------- */

unsigned long N = 40000; unsigned m=1;

double* charges; double* location;

charges = new double[N * m](); location = new double[N * 2]();

clock_t start; clock_t end;

double exactAssemblyTime; double exactComputationTime;

read_Location_Charges ("input/test_input.txt", N, location, m, charges);

MatrixXd charges_ = Map(charges, N, m);

MatrixXd Q;

ex1 Kex1;

/* Process ------------------------------------------------------------------------ */

// Matrix assembly

start = clock();

Kex1.kernel_2D(N, location, N, location, Q);

end = clock();

exactAssemblyTime = double(end-start)/double(CLOCKS_PER_SEC);

//Computation

start = clock();

MatrixXd QH = Q * charges_;

end = clock();

exactComputationTime = double(end-start)/double(CLOCKS_PER_SEC);

cout << endl << "Assembly time: " << exactAssemblyTime << endl;

cout << endl << "Computation time: " << exactComputationTime << endl;

// Clean up

delete []charges;

delete []location;

return 0;

}

matlab 矩阵与向量乘法,性能:Matlab与C矩阵向量乘法相关推荐

  1. 基于Matlab的LDPC码性能研究毕业设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 本科毕业设计(论文) 题 目    LDPC码性能研究 摘 要     信道编码是数字通信系统的 ...

  2. matlab产生一个稀疏向量,Matlab中的稀疏矩阵向量乘法比Python快吗?

    编辑:请参阅this question,在那里我学习了如何使用Numba在Python中并行化稀疏矩阵向量乘法,并能够与Matlab打交道.在 原题: 我发现在Matlab中稀疏矩阵向量乘法比Pyth ...

  3. matlab矩阵的第一列,matlab提取矩阵第一列

    第2章 MATLAB矩阵及其运算 2.1 变量和数据操作 2.2 MATLAB矩阵 2.3 MATLAB运算 2.4 矩阵分析 2.5 矩阵的超越函数 2.6 字符串 2.7 结构数据和单元数据 2. ...

  4. (7,4)汉明码在BPSK系统下的性能-MATLAB基带仿真

    (7,4)汉明码在BPSK系统下的性能-MATLAB基带仿真 仿真步骤 产生一定长度的值为0或1的随机序列 d ( t ) d(t) d(t). 根据监督矩阵,将初始数据序列映射为编码后的二元序列 s ...

  5. matlab 4d double,c – 对于 4D阵列MatLab造成巨大的性能损失?

    介绍 我有一个循环数十亿(数万亿)次数的算法并操纵存储在7维[10x10x10x10x10x10x10]中的矩阵,我发现访问7维矩阵中的元素非常慢,很好奇,因为我运行了一些测试来识别访问多维矩阵元素的 ...

  6. linux matlab r2010,《矩阵实验室》(Mathworks Matlab R2010a Win/UNIX )[光盘镜像]

    MATLAB 结合第三方软硬件产品组成了在不同领域内的完整解决方案,实现了从算法开发到实时仿真再到代码生成与最终产品实现的完整过程. 主要的典型应用包括: · 控制系统的应用与开发--快速控制原型与硬 ...

  7. 2.3 matlab矩阵求值(矩阵的行列式值、矩阵的秩、矩阵的积、矩阵的范数和矩阵的条件数)

    1.方阵的行列式 把一个方阵看作一个行列式,并对其按行列式的规则求值,这个值就称为方阵所对应的行列式的值.det(A):求方阵A所对应的行列式的值. >> format rat; > ...

  8. turbo编译码误码率性能matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 Turbo码是一种极为复杂的信道编码技术,译码算法往往由于硬件实现的复杂度太高或者译码时延太 ...

  9. matlab充分利用性能,Matlab高性能编程——代码优化和并行计算

    Jeremy Lin  @HQU Update: 2014/4/29 Matlab代码优化 Matlab是一种高级计算机语言,同时也是一个用于算法开发,数据可视化,数据分析和数值计算的交互式工作环境. ...

最新文章

  1. php 查看init,php 中init log
  2. 操作系统:基本分段存储管理方式
  3. 派生类的构造【C++继承】
  4. python find next_美化组4,findNext()函数
  5. 冬奥开幕在即,现场通信网络技术深度揭秘!
  6. python爬取网页上的特定链接_python 用bs4解析网页后,如何循环打开爬取出来的网址链接?...
  7. 浅谈ztree节点的增加和获取
  8. java volatile详解,互联网 面试官 如何面试
  9. matlab各类数学公式
  10. 农业大学计算机论文,农业大学毕业论文范文
  11. WEBBASE篇: 第六篇, CSS知识4
  12. 基于TCP的网络编程
  13. 软件测试笔试面试题目完全汇总
  14. flex和blazeds_使用BlazeDS和AMF构建Web和桌面应用程序
  15. 基于jmeter+perfmon的稳定性测试记录
  16. 软件工程专业就业方向
  17. Oracle EBS 付款后无法创建会计科目
  18. 颜色英文单词总汇(申明:来自于360)
  19. [转]网易新闻客户端为什么开始在北京市区的地铁、公交站牌大批量投放广告?...
  20. centos7.9-kvm-ESXi相关操作

热门文章

  1. 关于OPCUA的配套规范
  2. IGRP原理及配置案例
  3. 大年初五嘉定观影《天将雄师》后点评
  4. ThreadAbortException问题
  5. IO缓冲区(buffer)的原理及作用
  6. Chip-seq数据寻找Indel
  7. 用flash做连线题(线的一端跟随鼠标)
  8. 2022-2027年中国科技地产行业发展监测及投资战略研究报告
  9. 脑电分析工具MNE教程
  10. Stopping service [Tomcat]和Disconnected from the target VM排查