I’m halfway through figuring out a solution to my question, but I have a feeling that it won’t be very efficient. I’ve got a 2 dimensional cell structure of variable length arrays that is constructed in a very non-functional way in Matlab that I would like to convert to Clojure. Here is an example of what I’m trying to do:
pre = cell(N,1);
aux = cell(N,1);
for i=1:Ne
for j=1:D
for k=1:length(delays{i,j})
pre{post(i, delays{i, j}(k))}(end+1) = N*(delays{i, j}(k)-1)+i;
aux{post(i, delays{i, j}(k))}(end+1) = N*(D-1-j)+i; % takes into account delay
end;
end;
end;
My current plan for implementation is to use 3 loops where the first is initialized with a vector of N vectors of an empty vector. Each subloop is initialized by the previous loop. I define a separate function that takes the overall vector and the subindices and value and returns the vector with an updated subvector.
There’s got to be a smarter way of doing this than using 3 loop/recurs. Possibly some reduce function that simplifies the syntax by using an accumulator.
I’m not 100% sure I understand what your code is doing (I don’t know Matlab) but this might be one approach for building a multi-dimensional vector:
This only works if
indicesgo in the proper order (increasing), because you can’tconjorassoconto a vector anywhere other than one-past-the-end.I also think it would be acceptable to use
make-arrayand build your array viaaset. This is why Clojure offers access to Java mutable arrays; some algorithms are much more elegant that way, and sometimes you need them for performance. You can always dump the data into Clojure vectors after you’re done if you want to avoid leaking side-effects.(I don’t know which of this or the other version performs better.)