Matlab 了解如何计算失败次数

Matlab 了解如何计算失败次数,matlab,floating-point,counting,flops,Matlab,Floating Point,Counting,Flops,我很难掌握如何计算失败次数。前一刻我想我明白了,但下一刻我就不明白了。如果您能帮我解释一下,我们将不胜感激。我看过所有其他关于这个主题的帖子,没有一篇用我熟悉的编程语言(我知道一些MATLAB和FORTRAN)完全解释过 下面是一个例子,来自我的一本书,我正在尝试做什么 对于以下代码段,触发器的总数可以写为(n*(n-1)/2)+(n*(n+1)/2),这相当于n^2+O(n) 我试图应用上述相同的原理,在下面的代码(MATLAB)中找到触发器总数作为方程数n的函数 我绝对不是MATLAB方面的

我很难掌握如何计算失败次数。前一刻我想我明白了,但下一刻我就不明白了。如果您能帮我解释一下,我们将不胜感激。我看过所有其他关于这个主题的帖子,没有一篇用我熟悉的编程语言(我知道一些MATLAB和FORTRAN)完全解释过

下面是一个例子,来自我的一本书,我正在尝试做什么

对于以下代码段,触发器的总数可以写为
(n*(n-1)/2)+(n*(n+1)/2)
,这相当于
n^2+O(n)

我试图应用上述相同的原理,在下面的代码(MATLAB)中找到触发器总数作为方程数
n
的函数


我绝对不是MATLAB方面的专家,但我会尝试一下

我注意到代码中没有一行是向量的索引范围。很好,这意味着我看到的每一个操作都涉及一对数字。所以我认为第一个循环是每次迭代5次,第二个循环是每次迭代3次。中间有一个操作,

但是,默认情况下,MATLAB将所有内容存储为double。因此,循环变量k本身在每个循环上操作一次,然后每次从它计算索引时。第一个循环额外4个,第二个循环额外2个

但是等等——第一个循环有两次“k-1”,因此理论上可以通过计算和存储来优化该位,每次迭代减少一次失败。MATLAB解释器可能能够自己发现这种优化。就我所知,它可以算出k实际上可以是一个整数,而且一切都还可以

因此,你的问题的答案是,这要视情况而定。您想知道CPU执行的触发器数量,或者代码中表示的最小数量(即仅向量上的操作数量),或者如果根本没有优化,MATLAB将执行的严格触发器数量吗?MATLAB过去有一个flops()函数来计算这类事情,但现在已经不存在了。无论如何,我不是MATLAB专家,但我怀疑flops()已经消失了,因为解释器变得太聪明了,并且做了很多优化

我有点想知道你为什么想知道。我曾经使用flops()计算一段数学运算的次数,这是一种粗略的方法,用来估算我需要多少计算量才能使它以C语言实时运行

现在我来看看原语本身(例如,有一个1k复杂的FFT,根据库数据表,在CPU上是7us,有一个2k向量乘法,是2.5us,等等)。它有点棘手,因为必须考虑缓存速度、数据集大小等。数学库(如FFTW)本身是不透明的,这是所有人都能做到的。
因此,如果你因为这个原因计算失败的次数,你可能不会得到一个很好的答案。

可能重复的“否”不是。我需要了解如何确定触发器的总数作为方程“n”个数的函数。我不想要一个代码或什么东西来为我确定它。首先,你没有在问题中提供这些信息。其次,在第一个循环中有一个问题:迭代变量应该是
k
,而不是
x
。您是否运行此代码?是的,发布时出错。我修正了我的问题。你的问题很模糊,你要找的答案似乎不清楚。你是在问如何计算失败次数吗?你在寻找一个解析表达式,它是n的函数吗?图形化的可视化就足够了吗?所以,如果我的代码在循环中对向量的范围进行了索引,这将是一个更复杂的问题,对吗?因为它不再是一组对其进行操作的数字,它将是操作的整个数字索引,然后是循环迭代?我应该在我正在上的课上学习这个概念,教授不是很有帮助,所以我需要一些额外的建议。是的,这就是它的规模。想象一下用计算器手工完成这一切。每次你打+、-、*或者/你在做一个翻牌。例如,y=8*x(1:10)可以归结为x中10个元素的每个元素乘以8。那将是10次失败。但正如我所暗示的,代码中明显的操作数量并不意味着MATLAB实际执行了那么多操作;优化就是减少所做的工作,但最终得到完全相同的结果。MATLAB的速度非常慢,所以我认为Mathworks在动态优化代码方面做了一些努力。
[m,n]=size(A)
nb=n+1;
Aug=[A b];
x=zeros(n,1);
x(n)=Aug(n,nb)/Aug(n,n);
for i=n-1:-1:1
    x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i);
end
% e = subdiagonal vector
% f = diagonal vector
% g = superdiagonal vector
% r = right hand side vector
% x = solution vector

n=length(f);

% forward elimination
for k = 2:n
    factor = e(k)/f(k­‐1);
    f(k) = f(k) – factor*g(k‐1);
    r(k) = r(k) – factor*r(k‐1);
end

% back substitution
x(n) = r(n)/f(n);
for k = n‐1:­‐1:1
    x(k) = (r(k)‐g(k)*x(k+1))/f(k);
end