介绍
我有一个循环数十亿(数万亿)次数的算法并操纵存储在7维[10x10x10x10x10x10x10]中的矩阵,我发现访问7维矩阵中的元素非常慢,很好奇,因为我运行了一些测试来识别访问多维矩阵元素的性能.
假设
我提醒MATLAB的使用引擎盖下的线性索引和我的一个朋友说,性能损失可能是由于"正常"索引线性索引引擎盖下的转换来源.
测试方法
为了测试这个假设,我测试了使用线性索引和2D到7D矩阵的常规索引访问元素.我改变了我访问的元素以及我访问的矩阵大小,即每个维度的长度,但这并没有显着改变结果.我用于测试的文件如下所示.使用的硬件是Intel(R)Xeon(R)CPU E5-1620 v2 @ 3.70 GHz,16GB RAM.MatLab版本是R2013B.
结果
Normal indexing 2D: 0.073659s
Linear indexing 2D: 0.064026s
Normal indexing 3D: 0.050719s
Linear indexing 3D: 0.064096s
Normal indexing 4D: 0.055674s
Linear indexing 4D: 0.062112s
Normal indexing 5D: 15.689907s
Linear indexing 5D: 5.265076s
Normal indexing 6D: 16.660496s
Linear indexing 6D: 5.295958s
Normal indexing 7D: 17.029072s
Linear indexing 7D: 5.291139s
Run Code Online (Sandbox Code Playgroud)
在高达4D矩阵的性能方面,与线性索引相比,正常索引似乎非常相似.对于3D和4D矩阵,似乎使用正常索引略微优选.高于4D矩阵线性索引比正常索引更优选,但正常索引和常规索引都会受到巨大的性能损失(〜两个数量级).
结论
这个故事的寓意是在运行MatLab时要仔细考虑矩阵中超过四个维度的需求,以实现高性能(除了显而易见的事实,C++例如对于大多数应用程序来说更快等等,但这可能是另一个讨论) .
问题(S)
如标题所示:当矩阵超过四维时,这种巨大的性能损失的(潜在)原因是什么?其他语言(如C++)也证明了这种行为吗?
用于测试的代码
clear all
clc
% Number if iterations
n=10000000;
A = …Run Code Online (Sandbox Code Playgroud) 在处理大和负实数时,有没有人知道如何使下面的Matlab代码更准确地逼近指数函数?
例如,当x = 1时,代码效果很好,当x = -100时,它应该更接近3.7201e-44时返回8.7364e + 31的答案.
代码如下:
s=1
a=1;
y=1;
for k=1:40
a=a/k;
y=y*x;
s=s+a*y;
end
s
Run Code Online (Sandbox Code Playgroud)
欢迎任何帮助,欢呼.
编辑:
好的,问题如下:
这段代码接近哪个数学函数?(我说指数函数.)当x = 1时它是否有效?(是的.)不幸的是,当x = -100时使用它会产生答案s = 8.7364e + 31.您的同事认为该程序中存在一个愚蠢的错误,并请求您的帮助.仔细解释行为并给出一个简单的修复,产生更好的结果.[您必须建议对上述代码进行修改,或者使用它.您还必须检查您的简单修复工作.]
所以我有点明白,当术语之间存在16个(或更多)数量级时,问题会围绕大数字,精度会丢失,但解决方案不能解决.
谢谢
编辑:
所以最后我接受了这个:
s = 1;
x = -100;
a = 1;
y = 1;
x1 = 1;
for k=1:40
x1 = x/10;
a = a/k;
y = y*x1;
s = s + a*y;
end
s = s^10;
s
Run Code Online (Sandbox Code Playgroud)
不确定它是否完全正确但它会返回一些好的近似值.
exp(-100)= 3.720075976020836e-044 …
我正在 Visual Studio 2012 Professional (Windows) 中用 C/C++ 编写一个程序,其中包括使用pow(). 我运行分析器来找出为什么需要这么长时间才能运行,我发现这pow()就是瓶颈。
我重写了诸如
pow(x,1.5)到x*sqrt(x)
和
pow(x,1.75)到sqrt(x*x*x*sqrt(x))
这显着提高了程序的速度。
有一些权力是这样的pow(x,1.0/3.0),所以我寻找立方根函数cbrt()来加快速度,但它似乎在 Visual Studio 中不可用,我几乎无法想象,所以我的问题是:
我在哪里可以找到cbrt()Visual Studio 2012 Professional 中的该函数,如果没有,除了 之外还有哪些替代方案pow(x,1.0/3.0)?
亲切的问候,
恩斯特·扬
arctanh在Matlab上使用该功能时,我一直收到错误
arctanh"double"类型的输入参数的未定义函数.
我正在做这个计算
A = mu*arctanh(l2./(R2+R3))
Run Code Online (Sandbox Code Playgroud)
哪里l2和R2是向量.