Как поместить результаты в таблицу или массив в Mathematica?

Привет у меня есть список чисел, например, k_1,k_2,...k_n, и f является функцией. Теперь я применяю f в списке чисел, и мне нужно, чтобы эти числа увеличивались, т.е.

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]

Возможно, было бы неплохо начать изучать подход функционального программирования, поскольку Mathematica располагает инструментами для повышения его эффективности, приведенный выше код может выглядеть примерно так

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

Вы, кажется, хотите самую длинную возрастающую подпоследовательность. Самый простой и эффективный способ получить его в Mathematica состоит в следующем:

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

Пример:

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

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

В принципе, ответ не уникален - может быть несколько разных длинных увеличивающихся подпоследовательностей одинаковой длины.

Другие вопросы по тегам