2011-01-20 77 views
1

嗨 我有一个数字列表,例如k_1,k_2,... k_n,f是一个函数。 现在我在数字列表上应用f,我需要这些数字,例如f增加,如何把结果放在mathematica的表或数组中?

f(k_i)>f(k_j) for any i>j . 

我能得到的结果数K_I是在每一个不同的行,但我需要用逗号或别的东西和计数结果的数量分开在一个表中的结果。

例如:

k = Table[k1, k2, k3, k4, k5, k6, k7, k8, k9, k10]; 
count = 0; 
i=1; 
For[j = i, j <= 10, j++, 
    If[f[k[[j]]] - f[k[[i]]] > 0, i = j; Print["k", i]; 
    count = count + 1]]; 
Print["count= ", count] 

我喜欢的结果:

k2 
k3 
k5 
k9 
count=4 

,但我需要的结果是在一起:

{k2,k3,k5,k9} 
count=4 

什么想法?

感谢

回答

2

相反的Print,你可以做AppendTo,即

list={};AppendTo[list,5]

这可能是很好的开始学习函数式编程方法,因为数学有工具,使之有效,你上面的代码可能看起来像这样

pairs = Partition[list, 2, 1]; 
increasingPairs = Select[pairs, f[First[#]] < f[Last[#]] &]; 
Last /@ increasingPairs 
+0

输入列表= {5,3,6,1,5,7}返回{5,6} ... – 2011-01-20 12:54:20

2

你似乎t o想要最长的子序列。我知道得到它在数学中最简单,最有效的方法是:

lis[f_, vals_List] := LongestCommonSequence[#, Sort[#]] &[Map[f, vals]]; 

例子:

In[8]:= lis[# &, {5, 3, 6, 1, 5, 7}] 

Out[8]= {5, 6, 7} 

原则,答案不是唯一的 - 可能有几个不同的时间最长增加相同长度的子序列。