MATLAB: Accessing an element of an array using an array as its index.

access arrayindex using arrayinterpolationMATLAB

Hello,
I am writing up an interpolation function and need to define the vertices of the hypercube surrounding the current values.
My current code to do this is:
% (3) Calculate the A values that are the vertices of the N-D hypercube.
a = zeros(1,2^size(CURRENT,1)-1);
curridx = zeros(1,size(CURRENT,1));
idx = zeros(1,size(CURRENT,1));
for cnt = 1:(2^size(CURRENT,1))
change = find((mod(cnt-1,2.^(0:size(CURRENT,1)-1))==0)==1);
curridx(change) = 1*curridx(change)==0;
for cnt1 = 1:size(CURRENT,1)
idx(cnt1) = lidx(cnt1)*(curridx(cnt1)==0)+uidx(cnt1)*(curridx(cnt1)==1);
end
Subs = num2cell(idx);
a(cnt) = DATA(Subs{:});
end
With the profiler showing that the lines
Subs = num2cell(idx);
a(cnt) = DATA(Subs{:});
Are 32.1% and 23.8% of the total run-time respectively. Does anybody know a more efficient method?
Thank you!

Best Answer

Interesting...I guess your question title should be edited to "use array as subscripts into multidimensional array". I dug into the sub2ind() to extract how to use subscripts to get a linear index and came up with this test
siz = [4,3,5,7]
subs = [1,2,4,6]
subsc = num2cell(subs)
ndx = sub2ind(siz,1,2,4,6)
ndx = sub2ind(siz,subsc{:})
ndx = subs(1);
k = cumprod(siz);
for i = 2:length(subs)
ndx = ndx + (subs(i)-1)*k(i-1);
end
ndx
So you should be able to do
function ndx = sub2ind_a(siz,subs)
% no-check version of sub2ind, with input array of subs
ndx = subs(:,1);
k = cumprod(siz);
for i = 2:size(subs,2)
ndx = ndx + (subs(:,i)-1)*k(i-1);
end
end
And in your code:
siz = size(DATA); % somewhere at the top
% and in your loop
a(cnt) = DATA(sub2ind_a(siz,idx));
For readability I would change your variable name "idx" to "subs_a" or something.