在matlab中对矩阵元素求和的有效(最快)方法

2024-04-19

让我们有矩阵A say A = magic(100);。我见过两种计算矩阵所有元素之和的方法A.

sumOfA = sum(sum(A));

Or

sumOfA = sum(A(:));

其中一个比其他更快(或更好的练习)吗?如果有的话是哪一个?或者它们都同样快?


看来你无法决定性能和浮点精度哪个更重要。

如果浮点精度是最重要的精度,那么您将隔离正元素和负元素,对每个段进行排序。然后按绝对值递增的顺序求和。是的,我知道,这比任何人都会做的工作要多,而且可能会浪费时间。

相反,使用足够的精度,这样所犯的任何错误都无关紧要。使用关于测试等的良好数值实践,这样就不会产生问题。

就时间而言,对于 NxM 阵列,

sum(A(:)) 将需要 N*M-1 次加法。

sum(sum(A)) 将需要 (N-1)*M + M-1 = N*M-1 加法。

两种方法都需要相同数量的添加,因此对于大型数组,即使解释器不够聪明,无法识别它们都是相同的操作,谁在乎呢?

这根本不是问题。不要小题大作地担心这个。

编辑:为了回应 Amro 关于一种方法相对于另一种方法的错误的评论,您几乎无法控制。添加将以不同的顺序完成,但不能保证哪个顺序更好。

A = randn(1000);
format long g

这两个解决方案非常接近。事实上,与 eps 相比,差异几乎不显着。

sum(A(:))
ans =
          945.760668102446

sum(sum(A))
ans =
          945.760668102449

sum(sum(A)) - sum(A(:))
ans =
      2.72848410531878e-12

eps(sum(A(:)))
ans =
      1.13686837721616e-13

假设您选择我提到的隔离和排序技巧。请注意负数和正数部分足够大,以免造成精度损失。

sum(sort(A(A<0),'descend'))
ans =
          -398276.24754782

sum(sort(A(A<0),'descend')) + sum(sort(A(A>=0),'ascend'))
ans =
            945.7606681037

因此,无论如何,您确实需要将这些碎片累积在更高精度的数组中。我们可以试试这个:

[~,tags] = sort(abs(A(:)));
sum(A(tags))
ans =
          945.760668102446

即使在这些测试中也会出现一个有趣的问题。因为测试是在随机(正常)数组上完成的,所以会出现问题吗?本质上,我们可以将 sum(A(:)) 视为随机游走,醉汉游走。但考虑 sum(sum(A))。 sum(A) 的每个元素(即内部和)本身就是 1000 个正常偏差的总和。看看其中的几个:

sum(A)
ans =
  Columns 1 through 6
         -32.6319600960983          36.8984589766173          38.2749084367497          27.3297721091922          30.5600109446534          -59.039228262402
  Columns 7 through 12
          3.82231962760523          4.11017616179294         -68.1497901792032          35.4196443983385          7.05786623564426         -27.1215387236418
  Columns 13 through 18

当我们将它们相加时,精度会有所损失。因此,sum(A(:)) 的操作可能会稍微更准确。是这样吗?如果我们使用更高的精度进行累加会怎么样?首先,我将使用双精度数对列进行求和,然后转换为 25 位十进制精度,并对行求和。 (我在这里只显示了 20 位数字,留下 5 位数字作为保护数字隐藏。)

sum(hpf(sum(A)))
ans =
945.76066810244807408

或者,立即转换为 25 位精度,然后对结果求和。

sum(hpf(A(:))
945.76066810244749807

因此,双精度的两种形式在这里同样错误,方向相反。最后,这一切都是没有意义的,因为与简单的变体 sum(A(:)) 或 sum(sum(A)) 相比,我所展示的任何替代方案都更加耗时。只需选择其中之一即可,不用担心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在matlab中对矩阵元素求和的有效(最快)方法 的相关文章

  • 如何在 R 中导入 matlab 表

    我有一个matlab mat文件与表数据类型我想将其导入 R 中 我为此使用 readMat R 正在将其作为列表读取 之后有没有办法将列表转换为 R 中的数据帧或表格格式 当我使用as dataframe我收到以下错误 Error in
  • Matlab 中二维插值的函数形式

    我需要从二维数据数组构造一个插值函数 我需要返回实际函数的东西的原因是 我需要能够将函数作为我需要进行数值积分的表达式的一部分进行计算 因此 interp2 并没有解决这个问题 它不返回函数 我可以使用 TriScatteredInterp
  • 朴素分类器 matlab

    在 matlab 中测试朴素分类器时 即使我在相同的样本数据上进行训练和测试 我也会得到不同的结果 我想知道我的代码是否正确 是否有人可以帮助解释这是为什么 dimensionality reduction columns 6 U S V
  • 在包含一些通配符的大型列表中进行成员资格测试

    当列表包含特殊类别时 如何测试某个短语是否在大型 650k 短语列表中 例如 我想测试这个短语是否 he had the nerve 在列表中 确实如此 但是在 he had DETERMINER nerve where DETERMINE
  • jQuery 性能:hide() 与 is(':visible') - 哪个更快?

    我有多个下拉框 当单击链接时它们会下降 如果同时打开 这些盒子就有可能重叠 查询元素是否可见是否更快 box is visible 然后如果该框可见则将其隐藏 box hide 或者只是告诉它无论如何都要隐藏 为了便于论证 我们假设 50
  • 计算 IOrderedEnumerable 的数量而不消耗它

    我想做的 简短版本 var source new 2 4 6 1 9 OrderBy x gt x int count source Count lt get the number of elements without performin
  • 使用 lsqcurvefit 进行拟合

    我想将一些数据拟合到洛伦兹函数 但当我使用不同数量级的参数时 我发现拟合存在问题 这是我的洛伦兹函数 function value lorentz x x0 gamma amp value amp gamma 2 x x0 2 gamma
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • 如何在 MATLAB 中创建带有分级标记颜色的散点图?

    我想在 MATLAB 中绘制一个简单的散点图 标记颜色从光谱的一端到另一端各不相同 例如红色 橙色 黄色 蓝色 紫色 我的数据比较了一段时间内河流的水量和水质 3 个简单的列 时间 水量 质量 我想绘制数量与质量的 x y 散点图 但颜色随
  • 数组中 2 个百分位之间的平均元素

    我有 2 个长度为 200 的向量 例如 A 和 B 然后我使用以下方法找到数组 A 的每第二个百分位数 A1 prctile A 1 2 100 1 这样A1是一个长度为50的数组 现在我想找到A1中每两个元素内的A元素的平均值 即A的第
  • 用子矩阵替换 numpy 矩阵元素

    鉴于我有一个索引方阵 例如 idxs np array 1 1 0 1 以及彼此大小相同的方阵数组 不一定与idxs mats array 0 0 0 0 5 1 0 3 1 1 我想替换每个索引idxs对应的矩阵为mats 得到 arra
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • Windows 10 Fall Creators Update (1709) 后,log4net 处理呼叫者位置信息变得非常慢

    我知道 log4net 的文档指出 记录调用者位置信息可能非常慢 除非软件的性能不受影响 否则不应使用 在 Windows 10 秋季创意者更新之前 情况都是如此 这是一个小示例项目 应用程序配置
  • 如何在Matlab脚本中将泰勒级数系数存储到数组中

    这个问题是在 m 脚本的上下文中 我知道如何获取函数的泰勒级数 但我没有看到任何命令允许将级数的系数存储到数组中 sym2poly似乎不起作用 如何将系数存储到数组中 例如这个函数 syms x f 1 x 2 4 x 9 我们怎样才能得到
  • 在 Matlab 2014b 中移动等高线图的 z 值

    我正在尝试绘制曲面图 在曲面下方我希望显示轮廓线 但我希望轮廓位于z 1而不是默认值0 我找到了之前关于这个问题的帖子here https stackoverflow com questions 8054966 matlab how to
  • Java Keystore 是否存在性能问题? [复制]

    这个问题在这里已经有答案了 我们开发了一个应用程序来加密 解密来自服务器的请求 响应 我们正在做性能测试 加密 解密应用程序 我们观察到加密 解密过程需要时间 而许多线程 正在同时做 为了识别问题 我们记录了加密 解密过程中的所有方法 从记
  • “const”声明是否有助于编译器(GCC)生成更快的代码? [复制]

    这个问题在这里已经有答案了 Do const声明有助于编译器 GCC 生成更快的代码 还是仅对可读性和正确性有用 泽德 肖认为const在 C C 中无用或过度使用 接下来是对 const 的所有奇怪的迷恋 由于某些奇怪的原因 C 喜欢让你
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Android:RunOnUiThread 与 AsyncTask

    我相信 Google 建议开发人员使用 AsyncTask 但是 我想知道它与使用 new Thread 然后调用 RunOnUiThread 在性能和内存效率方面有何不同 使用 RunOnUithread 的示例 some code 1
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n

随机推荐