Here's a simple example. Suppose we want to find the off-diagonal matrix of m:
m={{1,2},{3,4}}
This can be solved fairly simply by extracting a list of the diagonal elements, re-creating the diagonal matrix from these, and removing them from the full matrix to get the off-diagonal elements:
m - DiagonalMatrix[Diagonal[m]]
to get
{{0,2},{3,0}}
Now, this was a fairly simple solution to the given problem, but what I'm wondering is if there is a way to write something akin to
(Identity - DiagonalMatrix@Diagonal)[m]
To get the same result. In this simple example, not much would be gained by doing this, but I just thought it could be interesting in more complicated problems and help make the code resemble more closely the underlying mathematics in some cases.
# - DiagonalMatrix[Diagonal[#]] &[m]? Of course you can addIdentity[#]at the beginning. – Kuba Feb 18 '14 at 20:39Compositionfor chaining long functions. It will greatly improve the clarity of your code. – rm -rf Feb 18 '14 at 20:45Throughtoo, e.g.Through[(f + g + h)[x]]givesf[x] + g[x] + h[x]. – Simon Woods Feb 18 '14 at 21:32@doesn't denote function composition, but function application (useCompositionfor function composition) and becauseThroughonly goes in one level while here we actually have an expression of the form(a + (-1)*b), not of a simpler forma-b. I'm afraid there's no easy and simple solution to your problem other than building pure functions as in(Identity[#] - DiagonalMatrix@Diagonal[#]) &[m]. – Szabolcs Feb 18 '14 at 22:42operatorApply, and define neat layouts for both – Rojo Feb 18 '14 at 22:51operatorApply[f_[x__]] := Replace[f, s_Symbol :> s[x], {0, Infinity}, Heads -> False]. See where this goes wrong:operatorApply[(Sin + 1)[x]]transforms toSin[x]+1, all is fine. Now what aboutoperatorApply[(Sin + Pi)[x]]? You getPi[x] + Sin[x], wrong! This is probably why it's not a built-in function. I don't see a good way around this problem, i.e. it's not a problem with my implementation but an inherent problem to the idea: it's not possible to distinguish functions from other symbols, e.g. constants. – Szabolcs Feb 18 '14 at 23:35Constantattribute. But the idea included some operator wrapper symbol too, to make things more robust – Rojo Feb 19 '14 at 01:05Piwas just one example. There are plenty more situations where something likeoperatorApplywouldn't fit well into the system. There's a number of exceptions that would need to be implemented, such asFunction,Composition,InterpolatingFunction,ParametricFunctionand probably other things I haven't though of. – Szabolcs Feb 19 '14 at 01:41fun[One][x_]:=x; fun[Two][x_]:=x^2, whereOne/Twoare symbols setting some option. There's no way to tell thatOneis not a function and no way to tell thatfun[One]is a function. Generally, we come back to the point that it's impossible to reliably tell what is a function and what isn't. – Szabolcs Feb 19 '14 at 01:44