当前位置:  开发笔记 > 编程语言 > 正文

MATLAB对数组值表达式的所有元素求和

如何解决《MATLAB对数组值表达式的所有元素求和》经验,为你挑选了1个好方法。

所以我现在一直在想这个问题.总结一些数组变量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')

编辑:它不同于如何在不首先将其分配给局部变量的情况下索引函数返回的MATLAB数组?,因为它不涉及数组值表达式或返回值的一般(或特定)索引,而是涉及每个可能索引的总和.

虽然可以通过链接中给出的答案解决我的问题,但是gnovice说自己使用subref是一个相当丑陋的解决方案.Andras Deak在下面的评论中发布了更为清晰的方式.



1> Andras Deak..:

虽然链接副本的答案确实可以应用于您的问题,但问题的范围越窄,我们就可以提供比其中提供的答案更简单的解决方案.

您可以通过首先将数组重新整形为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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有