digitalmars.D - Built-in array ops
- bearophile (78/78) Jul 25 2012 This is useful Mathlab code (from Expokit, it's part of code to
This is useful Mathlab code (from Expokit, it's part of code to
compute exponents of sparse matrices coming from Markov chains):
http://www.maths.uq.edu.au/expokit/matlab/mexpv.m
It's related to this Fortran code:
http://www.maths.uq.edu.au/expokit/fortran/dmexpv.f
If I have to write minimally serious D code to implement
something similar to that Mathlab or Fortran code, like this:
while t_now < t_out
istep = istep + 1;
t_step = min( t_out-t_now,t_new );
V = zeros(n,m+1);
H = zeros(m+2,m+2);
V(:,1) = (1/beta)*w;
for j = 1:m
p = A*V(:,j);
for i = 1:j
H(i,j) = V(:,i)'*p;
p = p-H(i,j)*V(:,i);
end;
s = norm(p);
if s < btol,
k1 = 0;
mb = j;
t_step = t_out-t_now;
break;
end;
H(j+1,j) = s;
V(:,j+1) = (1/s)*p;
end;
if k1 ~= 0,
H(m+2,m+1) = 1;
avnorm = norm(A*V(:,m+1));
end;
I use a library that implements efficient rectangular and sparse
matrices and some useful functions like zeros() and more, so the
Mathlab code like this:
p = p-H(i,j)*V(:,i);
becomes (assuming Don's proposal to introduce multiple
user-defined dollars):
p -= H(i, j) * V(0..$, i);
replacing ":" with "0..$" introduces more noise but it's probably
acceptable. In such code I use only such library-defined data
structures, so built-in array ops are never used.
Maybe you want to use built-in array ops in casual D code, that
doesn't want to import a whole good matrix library, but in
practice so far in my D2 code I have needed vector ops only quite
rarely (while I have several time desired a sparse matrix
library, for simulations and more).
In well known C++ libraries templates are used in complex ways to
remove the creation of intermediate arrays in long vectorized
expressions. D built-in vector ops are able to do that, but when
performance is important I am probably already using a
matrix/vector library (also for flexibility, because it supports
sparse arrays, disk-mapped very large tensors, and so on). I
don't remember people using those template metaprogramming tricks
in D.
While I like built-in array ops, what are their use cases to
justify their presence in the language? Has someone used them a
lot so far? Is deprecating them going to damage future D in some
way?
Isn't it better to introduce in D syntax (like the multiple $
from Don) that allows future D programmers to implement highly
efficient matrix libraries with a clean syntax for the final
user? "Highly efficient" may mean offer built-in ways to avoid
the creation of intermediate library-defined arrays in complex
expressions, and maybe it also means offering built-in ways to
help the management of the hierarchical nature of the memory of
future computing systems, as done in Chapel language.
This is one case where I agree with Andrei that giving language
tools to build good libraries is probably better than putting
things in the language itself. As example I think that built-in
tuples are 200 times more useful/handy than built-in vector ops,
despite I write mixed scientific D2 code that is using arrays a
lot. Also, currently D vector ops are in many cases less
efficient than normal loops, for all but the largest 1D dense
arrays.
Bye,
bearophile
Jul 25 2012








"bearophile" <bearophileHUGS lycos.com>