所以我现在一直在想这个问题.总结一些数组变量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在下面的评论中发布了更为清晰的方式.
虽然链接副本的答案确实可以应用于您的问题,但问题的范围越窄,我们就可以提供比其中提供的答案更简单的解决方案.
您可以通过首先将数组重新整形为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