структура петли в математике - PullRequest
2 голосов
/ 03 ноября 2010

Спасибо, что ответили на предыдущий вопрос, который я имел ранее, я сделал следующее, но я пытаюсь выполнить этот цикл, но ошибки нет. Я пытаюсь сделать разницу в дате.

In[7] = Import["testA.txt", "Table" , "HeaderLines" -> 1]
Out[7] = {{100, 2010, 2, 20, 2010, 8, 30}, {110, 2010, 4, 30, 2010, 9, 
           12}, {112, 2010, 8, 20, 2010, 10, 28}}

In[10] =  For[i = 1, i < 4,   
          i = i + 1, {a = Out[7] [[i, 2]], b = Out[7] [[i, 3]],   
          c = Out[7] [[i, 4]] , d = Out[7][[i, 5]], e = Out[7][[i, 6]],   
          f = Out[7][[i, 7]], DateDifference[{a, b, c}, {d, e, f}]}]  

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

Поскольку вы, похоже, хотите обрабатывать каждый элемент списка отдельно, я бы использовал для этого Map (или его краткую форму /@) следующим образом.

In[1]:=data = {{100, 2010, 2, 20, 2010, 8, 30}, 
               {110, 2010, 4, 30, 2010, 9, 12}, 
               {112, 2010, 8, 20, 2010, 10, 28}};
       #~Join~{DateDifference[#[[2;;4]],#[[5;;]]]}& /@ data
Out[1]:={191, 135, 69}

Mathematica - это, прежде всего, функциональный язык программирования, поэтому, хотя существуют такие конструкции, как For, обычно лучше мыслить с точки зрения функций, работающих с выражениями и их преобразования.Часто, если вам нужен такой процедурный процесс, как For, лучше ставить Table.

Мой код имеет один небольшой недостаток, отсутствие именованных переменных иногда может быть проблемой,В этом случае, однако, они не являются необходимыми.Но, если они вам нужны, есть несколько конструкций, которые можно использовать With, Block, Module или даже Function.

3 голосов
/ 03 ноября 2010

Предупреждение: это не тот путь, по которому

Это ваша программа исправлена ​​и работает. Я публикую его, потому что я видел концептуальные ошибки в вашем коде и думал, что наличие работающей версии для сравнения с вашей может помочь вам идентифицировать их и изучить.

Некоторые баллы:

  • Использование общих конструкций (длина @ x, i ++ и т. Д.)
  • Не используйте "Out [n] =" ... Никогда не используйте заглавные буквы в качестве первого символа имени переменной
  • Узнайте, как создавать списки (см. AppendTo)

Вот бегущий код:

x = Import["testA.txt", "Table" , "HeaderLines" -> 1]

ret = {};
For[i = 1, i <= Length@x, i++,
  AppendTo[ret,
    {a = x[[i, 2]],
     b = x[[i, 3]],
     c = x[[i, 4]],
     d = x[[i, 5]],
     e = x[[i, 6]],
     f = x[[i, 7]],
     DateDifference[{a, b, c}, {d, e, f}]}
    ];
  ];
Print@ret  

Но, как я сказал, ЭТО НЕ ПУТЬ. Прочитайте и изучите (и запустите в режиме отладки!) Ответ rcollyer, чтобы понять, как это сделать правильно в Mathematica.

Кстати, вы можете заменить цикл For таблицей (см. Предложение rcollyer)

Table[
      {a = x[[i, 2]],
       b = x[[i, 3]],
       c = x[[i, 4]],
       d = x[[i, 5]],
       e = x[[i, 6]],
       f = x[[i, 7]],
       DateDifference[{a, b, c}, {d, e, f}]}, {i, Length@x}]
3 голосов
/ 03 ноября 2010

Да.For [] не генерирует вывод.Различия, которые вы хотели получить на компьютере, были вычислены (191, 135 и 69), а результаты не были нигде записаны или сохранены.Чтобы сделать это очевидным, перепишите свой вызов DateDifference [] на Print[DateDifference[{a,b,c},{d,e,f}]];.

Без каких-либо дополнительных подсказок о том, что вы хотели бы, чтобы произошло.Не понятно, как дать еще совет.Вы могли бы сеять [] и пожинать [].Вы можете присоединить [] результат DateDifference [] к списку результатов.Вы можете распечатать разницу (как описано выше).Вы можете присвоить результаты некоторой переменной (переменным), определить символ, который будет принимать значения определенных входных данных, и т. Д., И т. Д., И т. П.

- РЕДАКТИРОВАТЬ -

Да, и для обращения к некоторым другим респондентам правильная форма этого кода:

    foo = Import["testA.txt", "Table" , "HeaderLines" -> 1];
    diff[in_List] := Join[in[[Range[2, 7]]], {DateDifference[in[[Range[2, 4]]], in[[Range[5, 7]]]]}]
    diff /@ foo

Вывод: {{2010, 2, 20, 2010, 8, 30, 191}, {2010, 4, 30, 2010, 9, 12, 135}, {2010, 8, 20, 2010, 10, 28, 69}} (и вы, вероятно, хотите назначитьчто где-то тоже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...