小编EJG*_*G89的帖子

48
推荐指数
2
解决办法
9万
查看次数

对于> 4D阵列MatLab造成巨大的性能损失?

介绍

我有一个循环数十亿(数万亿)次数的算法并操纵存储在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)

c++ indexing performance matlab multidimensional-array

5
推荐指数
1
解决办法
671
查看次数

Matlab代码近似指数函数

在处理大和负实数时,有没有人知道如何使下面的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 …

math matlab approximation exp

4
推荐指数
2
解决办法
8066
查看次数

Visual Studio 2012 中的三次根函数 cbrt()

我正在 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)

亲切的问候,

恩斯特·扬

c++ root cubic visual-studio-2012

4
推荐指数
1
解决办法
2351
查看次数

Matlab arctanh功能

arctanh在Matlab上使用该功能时,我一直收到错误

arctanh"double"类型的输入参数的未定义函数.

我正在做这个计算

A = mu*arctanh(l2./(R2+R3))
Run Code Online (Sandbox Code Playgroud)

哪里l2R2是向量.

math matlab

2
推荐指数
1
解决办法
156
查看次数