Настройка счетчика в таблице

У меня есть два вопроса,

Q1. Код ниже:

orgtable = Table[{i, node2 = i + 1, node3 = node2 + 6, node4 = node3 - 1, 
                     node5 = i + 18, node6 = node5 + 1, node7 = node6 + 6, 
                     node8 = node7 - 1}, {i, 1, 36}
           ];
modtable = Drop[orgtable, {6, 36, 6}];
finaltable = With[{n = 5, m = 10},Flatten[Partition[modtable, n, n + m, 1, {}], 1]]

Первый фрагмент кода дает мне исходную таблицу, второй — измененную таблицу, а третий — итоговую таблицу. Вывод итоговой таблицы выглядит так:

{{1, 2, 8, 7, 19, 20, 26, 25},    {2, 3, 9, 8, 20, 21, 27, 26}, 
 {3, 4, 10, 9, 21, 22, 28, 27},   {4, 5, 11, 10, 22, 23, 29, 28},
 {5, 6, 12,11, 23, 24, 30, 29},   {19, 20, 26, 25, 37, 38, 44,43},
 {20, 21, 27,26, 38, 39, 45, 44}, {21, 22, 28, 27, 39, 40, 46, 45},
 {22, 23, 29,28, 40,41, 47, 46},  {23, 24, 30, 29, 41, 42, 48, 47}}

Но я хочу, чтобы он установил счетчик для финальной таблицы, чтобы мой вывод выглядел так (ниже): счетчик увеличится на 1, а в приведенном ниже примере он начнется с 200;

{{200,1, 2, 8, 7, 19, 20, 26, 25}, {201,2, 3, 9, 8, 20, 21, 27, 26},
 {202,3, 4,10, 9, 21,22, 28, 27},  {203,4, 5, 11, 10, 22, 23, 29, 28},
 {204,5, 6, 12,11, 23, 24, 30, 29} and so on

Как вы можете видеть из желаемого вывода, счетчик присутствует для каждого элемента и увеличивается на единицу.

Теперь вопрос номер два:

mycounter = 100;
tryone = 
   TableForm[
     Flatten[
       Table[{++mycounter, xcord, ycord, 
              (150*(Sin[((xcord - 90*2*3.14)/180]^2)*
                   (Sin[((ycord - 45)*2*3.14)/180]^2)
               ) + 20
             }, {xcord, 0, 200, 5}, {ycord, 0, 200, 5}
       ], 1
     ]
   ]

В приведенном выше примере я успешно реализовал счетчик, который начинается со 100 и увеличивается на 1, и он дает мне вывод

100 0 0 20.03

101 0 5 20.04 and so on..

Но теперь я хочу использовать для этого функцию Transpose, так как я хочу транспонировать представленное значение, но в то же время я не хочу транспонировать «мой счетчик».

mycounter = 100;
secondtry= 
  TableForm[
    Flatten[
      Transpose[
        Table[{++mycounter, xcord, ycord, 
                (150*(Sin[((xcord - 90)*2*3.14)/180]^2)* 
                     (Sin[((ycord - 45)*2*3.14)/180]^2)
                 ) +20}, {xcord, 0, 200, 5}, {ycord, 0, 200, 5}
        ]
      ], 1
    ]
  ]

Но, как вы можете видеть, функция Transpose также транспонирует «mycounter», чего я не хочу. Как сделать так, чтобы функция транспонирования не работала с "mycounter", но работала с остальными? Любая другая идея реализации счетчика в приведенном выше коде также приветствуется.


person Proj_UK    schedule 06.09.2011    source источник
comment
@Sjoerd ... Ты выиграл гонку редактирования :)   -  person Dr. belisarius    schedule 06.09.2011
comment
@belisarius Разве мы не должны получать оранжевую полосу с предупреждением о том, что мы редактируем одновременно? Не видел ни одного.   -  person Sjoerd C. de Vries    schedule 06.09.2011
comment
@Sjoerd Я сделал. Но только при попытке сохранить правки.   -  person Dr. belisarius    schedule 06.09.2011


Ответы (4)


Удален ответ на первый вопрос, так как я, вероятно, не понял, что вы хотели.

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

Но в данном случае кажется, что Transpose совершенно лишний. Достаточно поменять порядок индексов вашей таблицы. Если вы это сделаете, вы можете оставить свой счетчик как есть:

mycounter = 100;
secondtry = 
  Flatten[
    Table[{mycounter++, xcord,ycord, 
          (150*(Sin[((xcord - 90)*2*3.14)/180]^2)*
               (Sin[((ycord - 45)*2*3.14)/180]^2)
          ) + 20}, 
          {ycord,0, 200, 5}, {xcord, 0, 200, 5} (* order switched here *)
    ], 1
  ]

Несколько замечаний: я удалил TableForm из вашего задания. Обычно это используется только для печати, а не для данных, которые присваиваются переменной. Если вы хотите выполнить задание и одновременно увидеть результат, вы можете попробовать что-то вроде

 (myVar = Table[...{...},{...}] ) //TableForm

Также обратите внимание, что вам не нужно умножать на 3,14/180, чтобы преобразовать градусы в радианы. Для этого в Mathematica есть встроенная величина с именем Degree (если вы используете сочетание клавиш esc deg esc, вместо этого вы получите красивый символ степени). Похоже, вы умножаете на 2 пи/180 для этого преобразования. Если это было вашим намерением, оно было неверным. Преобразование составляет либо 2 пи/360, либо пи/180. ((xcord - 90)*2*3.14)/180 следует записать как (xcord - 90)Degree.

person Sjoerd C. de Vries    schedule 06.09.2011
comment
Большое спасибо... вы заставили меня осознать большую ошибку - person Proj_UK; 09.09.2011

Вопрос 1 :

Transpose[Prepend[Transpose[#], Range[Length[#]] + 200]] &@
 {{1, 2, 8, 7, 19, 20, 26, 25}, {2, 3, 9, 8, 20, 21, 27, 26}, {3, 4, 
   10, 9, 21, 22, 28, 27}, {4, 5, 11, 10, 22, 23, 29, 28}, {5, 6, 12, 
   11, 23, 24, 30, 29}, {19, 20, 26, 25, 37, 38, 44, 43}, {20, 21, 27,
    26, 38, 39, 45, 44}, {21, 22, 28, 27, 39, 40, 46, 45}, {22, 23, 
   29, 28, 40, 41, 47, 46}, {23, 24, 30, 29, 41, 42, 48, 47}}

Вопрос 2:

Function[mat, 
  Partition[
   Transpose[Prepend[Transpose[#], Range[Length[#]] + 99]] &@
    Flatten[mat, 1], Length[mat]]]@
 Table[{xcord, 
   ycord, (150*(Sin[((xcord - 90)*2*3.14)/
          180]^2)*(Sin[((ycord - 45)*2*3.14)/180]^2)
     ) + 20
   }, {xcord, 0, 200, 50}, {ycord, 0, 200, 50}
  ]
person Rolf Mertig    schedule 06.09.2011

Создайте остальную часть таблицы без счетчика, создайте подходящую n*1 матрицу индекса, используя Range, а затем используйте MapThread с внутренней функцией Join, чтобы соединить их вместе.

person Verbeia    schedule 06.09.2011

Ваш finaltable также может быть получен из modtable с использованием Table следующим образом:

finaltableAlt = Delete[#, Transpose@{Flatten@Table[i + j, {i, 5, (
          Length[#] - 10), 15}, {j, 10}]}] & @ modtable 

Другой вариант нумерации:

MapIndexed[Flatten@{#2[[1]] + 199, #1} &, finaltableAlt]
person tomd    schedule 06.09.2011