Yes mset! and friends are fairly traditional imperative operations.
They are pretty fast as well, though be aware that it is much better in general to use a bulk operation like add! rather than doing mset! for each individual element (it's better to only pay the protocol dispatch once....)
As always, mutable state introduces complexity, so I wouldn't use it unless you are sure that you need it. core.matrix is designed so that you can use it in an immutable / functional style most of the time, and only drop down to mutation when you *really* need performance.
Some risks:
- Mutable ops in core.matrix aren't guaranteed to be thread safe (depends on the underlying implementation, but most aren't...)
- Usual risks about needing defensive copying when passing parameters
- Mutable ops will fail on immutable arrays. You need to be somewhat careful about this...
- Laziness can throw some curve-balls at you: Clojure code isn't always executed in the order you expect.....