matlab矩阵特征向量的求法,matlab矩阵列向量求和
前言
前几天,我问了关于矩阵实验室和计算机编程语言的性能的问题(性能:材料vs python)。矩阵实验室比计算机编程语言快,特别是在网格上,有人指出讨论这个问题时应该用计算机编程语言的包装器来调用我的c,我很惊讶。
在这样做的过程中,Matlab再次惊讶于矩阵的组装和计算比c还快。有一个稍微大一点的代码,正在研究矩阵向量乘法。大代码在多个实例中执行这样的乘法。总体上,c的代码比矩阵实验室快得多,但由于矩阵实验室的函数调用有开销等原因,Matlab使用矩阵向量乘法(
结果
下表显示了组装内核矩阵所需的时间与矩阵和向量相乘所需的时间的比较。结果被编译为矩阵大小NN,其中n在10,000到40,000之间变化。哪个不是很大。但是,有趣的是,通过垫子得到的n越大,性能越好Matlab .总时间加快3.8倍至5.8倍。另外,在矩阵的组装和计算中
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
n=10,000 assemblycomputationtotal
MATLAB 0.3387 0.031 0.3697
C 1.15 0.24 1.4
快了3.8倍
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
n=20,000 assemblycomputationtotal
MATLAB 1.089 0.0977 1.187
C 5.1 1.03 6.13
快了5.2倍
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
n=40,000 assemblycomputationtotal
MATLAB 4.31 0.348 4.655
C 23.25 3.91 27.16
快了5.8倍
请参见- -
问题
C那么有更快的方法吗?我错过了什么吗?我知道C使用为循环,但我理解矩阵实验室也会在网格上做同样的事情。
代码片段
矩阵实验室代码:
% % getinputdatafromdatafiles-getinputdatafromdatafiles-
%从输入文件读取数据
数据=负载(输入/输入。txt);
位置=数据(:1:2;
收费=数据(:3:结束);
n=长度(位置);
m=大小(电荷,2);
% % exactmatrixvectorproduct-exactmatrixvectorproduct把- -
kex1=ex1
痉挛
q=kex1 .内核_2d(位置,位置);
frintf((nasassemblytime:% f)、TOC);
痉挛
potential_exact=Q *电荷;
计算时间:% f (n),TOC);
类(使用消息网格) :
类def ex1
方法
function[Kernel]=Kernel_2d(obj,x,y))))))。
[i1,J1]=网格网格(y 65:1),x 65:1);
[i2,J2]=网格网格(y 65:2),x 65:2);
内核=sqrt((I1-J1).^2) I2-J2).^2);
结束
结束
结束
c代码:
编辑
使用标记为以下的制造文件进行编译:
CC=g
cflags=-c-fopen MP-w-wall-dn debug-O3-March=native-ffast-math-f finite-math-only-I header/-I/usr
LDFLAGS=-g -fopenmp
LIB_PATH=
源text=src/read _ location _ charges .卡片打印处理机(卡片打印处理器的缩写)
SOURCESF=examples/matvec.cpp
对象sf=$(来源SF:CPP=.o)源文本3360 .CPP=.o))))))))))))))))。
EXECUTABLEF=./exec/mykernel
我的内核:$(sources SF)$(sources text)$(executable eef))))))))))))。
$(executable eef(:$)objectsf))))))))))。
$(cc)$(LD flags)$(kernel))($(INDEX)objectsf(-o $ @ $)lib _ path))。cpp.o:
$(cc)$(CFLAGS)$(内核)$(索引)$ -o $@
`
#包含"环境. hpp "
使用命名空间标准
使用命名空间人名
ex1级
{
公共:
void kernel _ 2d(constunsignedlongm,double* x,const unsigned long N,double* y,MatrixXd kernel))。
kernel=matrixxd:3360zero(m,n);
对于(无符号长I=0;我
对于(无符号龙j=0;j
doublex=(x[0 * nI]-y[0 * NJ];
doubley=(x[1 * nI]-y[1 * NJ];
Kernel(I,j)=sqrt)(x * x)(Y * Y);
}
}
}
(;
int main())
{
/*把输入- -
无符号长整型N=40000无符号m=1;
双*字符;双*定位;
费用=新的double[N * m](;location=new double[N * 2](;
时钟启动时钟结束;
double exact assembly time double exact computationtime
读取位置费用(输入/测试输入。txt ,n,位置,m,费用);
MatrixxdCharges _=map(电荷,n,m);
矩阵xd Q;
ex1 Kex1
请参阅/*流程-
//矩阵组件
开始=时钟(;
kex1.kernel_2d(n,location,n,location,q);
end=clock(;
exactassemblytime=double(end-start)/double(clocks _ per _ sec);
//计算
开始=时钟(;
矩阵xd QH=Q *电荷_;
end=clock(;
exactcomputationtime=double(end-start)/double(clocks _ per _ sec);
cout endl 汇编时间: exactassemblytimeendl
cout endl 计算时间: exactcomputationtimeendl
//清理
删除[]项费用;
删除[ ]位置;
返回0;
}