开发者

How to implement MapThread with basic list mapping?

Mathematica has a function MapThread that behaves like this:

MapThread[ f , { {a,b,c} , {d,e,f} } ]
-> { f[a,d] , f[b,e] , f[c,f] }

I'd like to implement this in TeX, which has very primitive programming facilities. I've basic facilities for iterating over lists, but no logical indexing into them. Given this restriction, is there an algorithm for looping synchronously though multiple lists?

I could write something like the following: (pseudocode)

ii = 0; jj = 0;
for elem1 in list1
  ii = ii+1
  for elem2 in list2
    jj = jj+1
    if ii == jj
      return ( elem1 , elem2 )
    fi
  end
end

but it seems terribly inefficient. Note that the big restriction is that I can't access elements of lists numerically, so some开发者_高级运维thing like the following is too "high level":

for ii = 1:length(list1)
  func ( list1(ii) , list2(ii) )
end

The reason this restriction is in place is that in order to implement list1(ii) I'd need to write something like the following in the first place:

jj = 0
for elem1 in list1
  jj = jj+1
  if ii=jj
    return elem1
  fi
end

Or is the inefficient case probably the best I'll be able to do with such a primitive language?


In pseudocode, as long as you can test whether a list is empty, you can do it like so:

while (list1 is not empty) and (list2 is not empty)
  x1 = first(list1);
  x2 = first(list2);
  list1 = rest(list1);
  list2 = rest(list2);

  func(x1, x2);
end while

It's still not going to win any beauty contests, but it'll get the job done without being crushingly inefficient.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜