【问题标题】:MATLAB sum over all elements of array valued expressionMATLAB 对数组值表达式的所有元素求和
【发布时间】:2016-03-05 10:25:58
【问题描述】:

所以我一直在想这个问题。总结一些数组变量A 就像

sum(A(:))
% or
sum(...sum(sum(A,n),n-2)...,1) % where n is the dimension of A

但是,一旦遇到表达式,(:) 就不再起作用了,比如

sum((A-2*A)(:))

不是有效的matlab语法,我们需要写

foo = A-2*A;
sum(foo(:))
%or the one liner
sum(sum(...sum(A-2*A,n)...,2),1) % n is the dimension of A

只有在 A 的尺寸是固定的情况下,上面的一个衬里才有效,这取决于您在做什么,可能不一定是这种情况。这两行的缺点是, foo 将一直保存在内存中,直到您运行 clear foo 或者甚至可能无法使用,具体取决于 A 的大小以及您工作区中的其他内容。

有没有一种通用的方法来规避这个问题并将数组值表达式的所有元素总结在一行中/而不创建时间变量? sum(A-2*A,'-all') 之类的东西?

编辑:它与How can I index a MATLAB array returned by a function without first assigning it to a local variable? 不同,因为它不涉及数组值表达式或返回值的一般(或特定)索引,而是每个可能索引的总和。

虽然可以通过链接中给出的答案解决我的问题,但 gnovice 自己说使用 subref 是一个相当丑陋的解决方案。此外,Andras Deak 在下面的 cmets 中发布了一种更简洁的方法。

【问题讨论】:

  • 您为什么如此渴望避免使用临时变量?它在速度方面几乎没有关系,在 RAM 方面也没有关系(同样的变量将在 sum 调用中创建)。我想说sum(sum()) 可能会更快,因为重塑大型矩阵需要很多时间。
  • @Daniel 我相信这个问题有一个简单的答案,不涉及重复:sum(reshape(A-2*A,1,[]))。如果您同意,请重新打开,以便我回答。
  • @AndrasDeak 两个版本都可以,但你的版本看起来比使用subref 更干净。在这种情况下是否值得重新提出问题? (我不确定这里的正确行为准则。)
  • sum(A(:) - 2*A(:)) 呢?
  • @JeffIrwin 你也可以说-sum(A(:))。我认为这只是一个虚拟的例子。考虑fun(A) 的情况,它返回一个维数未知的多维数组...

标签: arrays matlab matrix


【解决方案1】:

虽然the linked duplicate 的答案确实可以应用于您的问题,但您的问题范围更窄,使我们能够提供比那里提供的答案更简单的解决方案。

您可以通过首先将数组整形为 1d 来对表达式中的所有元素(包括函数的返回值)求和:

sum(reshape(A-2*A,1,[]))
%or even sum(reshape(magic(3),1,[]))

这会将您的数组值表达式重塑为大小[1, N],其中N 是从数组的大小推断出来的,即numel(A-2*A)(但reshape 的上述语法将为您计算缺失的维度,无需评估您的表达式两次)。然后,对sum 的一次调用将根据需要汇总所有元素。

不得不诉诸这种方法的实际情况是,当函数返回一个维数未知的数组时, 你想在匿名函数中使用它的总和(使临时变量不可用):

fun = @() rand(2*ones(1,randi(10))); %function returning random 2 x 2 x ... x 2 array with randi(10) dimensions
sumfun = @(A) sum(reshape(A,1,[]));
sumfun(fun()) %use it

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多