【发布时间】: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)的情况,它返回一个维数未知的多维数组...