Настройка счетчика в таблице - PullRequest
1 голос
/ 06 сентября 2011

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

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
    ]
  ]

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

Ответы [ 4 ]

5 голосов
/ 06 сентября 2011

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

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

Но в этом случае кажется, что 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.

4 голосов
/ 06 сентября 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}
  ]
2 голосов
/ 06 сентября 2011

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

1 голос
/ 07 сентября 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]
...