Re: Re: Product
- To: mathgroup at smc.vnet.net
- Subject: [mg87681] Re: [mg87592] Re: Product
- From: "Szabolcs HorvÃt" <szhorvat at gmail.com>
- Date: Tue, 15 Apr 2008 05:55:03 -0400 (EDT)
- References: <200804110542.BAA04653@smc.vnet.net>
>
> Well, maybe I conceded too much too quickly ;-)
> When I wrote that "it would be quite hard or impossible ", I had in mind
> dealing with general tensors. Unfortunately I did not devote to this many
> any detailed thought but instinctively felt that, in the case of "general
> tensors", it would not be as easy to do the same things with Apply and Plus
> as with Total. When I first read your reply I again reacted too quickly and
> conceded the entire point. However, after cosnidering this issue a little
> more carefully, I now think the truth is more subtle. It was certainly very
> rash of me to write ""it would be quite hard or impossible", as it is
> clearly possible and in fact not at all hard. But now, I think, in the case
> of tensors there can be significant inconveniences in using the Apply, Plus
> combination instead of Total. Let me illustrate this. Consider this tensor:
>
> A = Array[a, {2, 3, 4}];
>
> Now, with Total we can add all elements in A with:
>
> Total[A, Infinity]
>
> a[1, 1, 1] + a[1, 1, 2] + a[1, 1, 3] + a[1, 1, 4] + a[1, 2, 1] + a[1, 2,
> 2] +
> a[1, 2, 3] + a[1, 2, 4] +
> a[1, 3, 1] + a[1, 3, 2] + a[1, 3, 3] + a[1, 3, 4] + a[2, 1, 1] +
> a[2, 1, 2] + a[2, 1, 3] + a[2, 1, 4] +
> a[2, 2, 1] + a[2, 2, 2] + a[2, 2, 3] + a[2, 2, 4] + a[2, 3, 1] +
> a[2, 3, 2] + a[2, 3, 3] + a[2, 3, 4]
>
> or we can do the same with Total[A,-1].
>
> Note, however, that this will give a completely different answer:
>
> Apply[Plus, A, {0, Infinity}]
> 144
>
> Of course what happened is that all the indexes got added. If we want to
> add all the tensor entries you
> need to correctly specify the highest level:
>
> Apply[Plus, A, {0, 2}]
> a[1, 1, 1] + a[1, 1, 2] + a[1, 1, 3] + a[1, 1, 4] + a[1, 2, 1] + a[1, 2, 2]
> +
> a[1, 2, 3] + a[1, 2, 4] +
> a[1, 3, 1] + a[1, 3, 2] + a[1, 3, 3] + a[1, 3, 4] + a[2, 1, 1] +
> a[2, 1, 2] + a[2, 1, 3] + a[2, 1, 4] +
> a[2, 2, 1] + a[2, 2, 2] + a[2, 2, 3] + a[2, 2, 4] + a[2, 3, 1] +
> a[2, 3, 2] + a[2, 3, 3] + a[2, 3, 4]
>
> Note also that now your rule:
>
>
>
> >
> > > Total[expression, {n}] is equivalent to Apply[Plus, expression, {n-1}]
> > >
> >
>
> does not work for negative indexes. Total[A,{-1}] is Apply[Plus,A,{-3}]
> and not Apply[Plus,A,-2}].
> The reason is again the same: Apply counts negative levels beginning with
> the atoms, which are in this case just the indexes.
>
> OK, so now comes my main point. Suppose that now we define
>
> a[x_, y_, z_] := Times[x, y, z]
>
> With this definition the array A turns into an array of integers. Now, note
> that
>
> Total[A, Infinity]
> 180
> Total[A, -1]
> 180
>
> have the same meaning as before, they are both the sum of all the entries
> of A. But the meaning of
>
> Apply[Plus, A, {0, Infinity}]
> 180
>
> has now changed. Recall that earlier the answer was 140, which was the sum
> of the indexes, and now it has become 180, which is the sum of entries. The
> same applies to some of the other cases of using the Apply, Plus
> combination. This "change of meaning" can be a serious inconvenience in
> certain situations.
>
> So while you can certainly do the same things with Apply and Plus and level
> specifications as with Total and level specifications, they seem to be
> intended for different purposes. Apply and Plus are more suitable for
> handling general expressions while Total is much more convenient for dealing
> with tensors. While you can always achieve the same purpose with Apply and
> Plus as with Total, doing so is not completely automatic but has to be based
> on individual cases.
>
> So I conclude that the reason for the existence of Total is not simply that
> of syntax but more importantly that of purpose: the Apply, Plus combination
> is more suitable for handling general expressions but Total is more suitable
> for dealing with tensors. I think it is a fairly significant difference.
Dear Andrzej,
Thanks for pointing this out! Now I see that Apply[Plus, ...] and
Total[] have a more important essential difference than the Method
option.
To sum up the main difference: Apply treats expressions with
different heads in the same way. But Total only touches those
subexpressions whose head matches the head of the complete expression.
For example,
Total[ f[...], Inifnity ]
will only sum the terms of expressions with head f, and
Total[ {...}, Infinity ]
will only sum lists (but it treats everything else as atoms).
Szabolcs
- References:
- Product
- From: "Steven" <steven_504@telenet.be>
- Product