2009-10-14 63 views
1

數學有一個函數MapThread,其行爲是這樣的:如何使用基本列表映射實現MapThread?

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

我想在TeX的,它有非常原始的編程工具來實現這一點。我有遍歷列表的基本工具,但沒有邏輯索引。有了這個限制,是否有一個算法可以通過多個列表同步循環?

我可以寫類似以下內容:(僞)

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 

,但似乎非常低效的。需要注意的是很大的限制是,我不能訪問數組中的元素數值,所以像下面太「強」:

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

的原因,這限制是到位的是,爲了實現list1(ii)我需要寫在第一個地方像下面這樣:

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

或者是低效率的情況下,可能是最好的我能與這樣一個原始的語言呢?

+0

您可以在這些列表上做相當於First []和Rest []的操作,並測試它們的長度是否爲零?在那種情況下,它並不那麼難;否則你的N^2技巧可能是最好的解決方案,而無需將自己的宏一起移動來操作列表。是的,第一個[]和第[]個可能是[ – Pillsy 2009-10-14 19:14:30

+0

]。啊,我想我明白你要去哪裏了。 – 2009-10-15 01:42:16

回答

2

僞代碼,只要你可以測試列表是否爲空,你可以像這樣:

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 

它仍然不會贏得任何選美比賽,但它會得到這份工作完成時不會非常低效。