Автоматическое удаление определенных элементов в таблицах Mathematica - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть вопрос, который можно разделить на два подвопроса.Я создал таблицу, код которой приведен ниже.

Задача 1.

xstep = 1;
xmaximum = 6;
numberofxnodes = 6;
numberofynodes = 3;
numberofzlayers = 3;
maximumgridnodes = numberofxnodes*numberofynodes
mnodes = numberofxnodes*numberofynodes*numberofzlayers;
orginaltable = 
   Table[{i, 
          node2 = i + xstep, node3 = node2 + xmaximum,
          node4 = node3 - xstep,node5 = i + maximumgridnodes,
          node6 = node5 + xstep,node7 = node6 + xmaximum,
          node8 = node7 - xstep}, 
        {i, 1, mnodes}]

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

 modifiedtable = Drop[orginaltable, {6, mnodes, 6}]

Теперь я получаю модифицированную таблицу, в которой удаляются каждый шестой элемент и кратные шестому элементу моей исходной таблицы.Это решает мою проблему 1.

Теперь моя проблема 2:

** ОСНОВНАЯ РЕДАКТИРОВАННАЯ ВЕРСИЯ ** :( ВСЕ КОДЫ, ВЫШЕ ВЫШЕ ПРАВИЛЬНО)

Большое спасибо заответы, но я хотел что-то еще, и я сделал ошибку, объясняя это первоначально, поэтому я делаю еще одну попытку.

Ниже моя модифицированная таблица: я хочу элементы между "/ ** и **/ "удалено и осталось там.

{{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}, {7, 8, 14, 13, 25, 26, 32, 31}, {8, 9, 15, 14, 26, 27, 33, 32}, {9, 10, 16,15, 27, 28, 34, 33}, {10, 11, 17, 16, 28, 29, 35, 34}, {11, 12, 18, 17, 29, 30, 36, 35}, / **{13, 14, 20, 19, 31, 32, 38, 37}, {14, 15, 21, 20, 32, 33, 39, 38}, {15, 16, 22, 21, 33, 34, 40, 39}, {16, 17, 23, 22, 34, 35, 41, 40}, {17, 18, 24, 23, 35, 36, 42, 41}, ** / {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}, {25, 26, 32,31,43, 44, 50, 49}, {26, 27, 33, 32, 44, 45, 51, 50}, {27, 28, 34, 33, 45, 46, 52, 51}, {28,29, 35, 34, 46, 47, 53, 52}, {29, 30, 36, 35, 47, 48, 54, 53}, / ** {31, 32, 38, 37, 49, 50, 56, 55}, {32, 33, 39, 38,50, 51, 57, 56}, {33, 34, 40, 39, 51, 52, 58, 57}, {34, 35, 41, 40, 52, 53, 59, 58}, {35, 36, 42, 41, 53, 54, 60, 59}, ** / {37, 38, 44, 43,55, 56, 62, 61}, {38,39, 45, 44, 56, 57, 63, 62}, {39, 40, 46, 45, 57, 58, 64, 63}, {40, 41, 47, 46, 58, 59, 65, 64}, {41, 42, 48, 47,59, 60, 66, 65}, {43, 44, 50, 49, 61, 62, 68, 67}, {44, 45, 51, 50, 62, 63,69, 68}, {45, 46, 52, 51, 63, 64, 70, 69}, {46, 47, 53, 52, 64, 65, 71, 70}, {47, 48, 54, 53,65, 66, 72, 71}, / ** {49, 50, 56, 55, 67, 68, 74, 73}, {50, 51, 57, 56, 68, 69, 75, 74}, {51, 52, 58, 57, 69, 70, 76, 75}, {52, 53, 59, 58, 70, 71, 77, 76}, {53, 54, 60, 59, 71, 72, 78, 77}} ** /

Теперь, если вы заметили, я хотел первую десяткуэлементы (с 1-го по 10-й элемент modifiedtable), которые будут в моей финальной таблице (DoubleModifiedTable).следующие пять (элементы с 11 по 15 modifiedtable) удалены.Затем следующие десять элементов (с 16 по 25 элементы modifiedtable), которые будут присутствовать в моей финальной таблице (DoubleModifiedTable), затем следующие пять удаленных (с 26 по 30 элементы modifiedtable) и так далее для всей таблицы.

Допустим, мы решили эту проблему и назовем финальный стол DoubleModifiedTable.

Я в основном заинтересован в получении DoubleModifiedTable.Я решил разделить проблему так, чтобы ее было легко объяснить.

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

Ответы [ 3 ]

4 голосов
/ 03 сентября 2011

Возможно, проще:

DoubleModifiedTable = 
  Module[{copy  = modifiedtable},
  copy[[Flatten[# + Range[5] & /@ Range[10, Length[copy], 10]]]] = Sequence[];
  copy]

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

Еще проще:

DoubleModifiedTable =
   Delete[modifiedtable,
     Transpose[{Flatten[# + Range[5] & /@ Range[10, Length[modifiedtable], 10]]}]]

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

По запросу OP: для получения ответа на измененную проблему нужно всего лишь изменить одно число (от 10 до 15) в любом из моих решений:

DoubleModifiedTable =
  Delete[modifiedtable,
    Transpose[{Flatten[# + Range[5] & /@ Range[10, Length[modifiedtable], 15]]}]]
3 голосов
/ 03 сентября 2011

Другой способ - сделать что-то вроде

DoubleModifiedTable = With[{n = 10, m = 5},
  Flatten[{{modifiedtable[[;; m]]}, 
    Partition[modifiedtable, n - m, n, {n - m + 1, 1}, {}]}, 2]]

Редактировать

Отредактированная версия Задачи 2 на самом деле немного проще, чем оригинальная.Например, вы можете сделать что-то вроде

DoubleModifiedTable = 
 With[{n = 10, m = 5}, Flatten[Partition[modifiedtable, n, n + m, 1, {}], 1]] 

Редактировать 2

Моя вторая версия состоит в том, чтобы разбить исходный список modifiedtable на подсписки, используя Partitionа затем сгладить эти подсписки, чтобы сформировать окончательный список.Если вы посмотрите документацию для раздела , вы увидите, что я использую шестую форму Partition, что означает, что длина подсписков равна n, а смещение (расстояние будет n+m. Таким образом, разрыв между подсписками составляет n+m-n==m.

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

Последний аргумент {} указывает, что для подсписков не должно использоваться заполнениедлина <=n.

В итоге, если вы хотите удалить первые 10 элементов и оставить следующие 5, вам нужны подсписки длиной n=5 с пробелом m=10. Так как вы хотите, чтобы начался первый подсписокс (m+1) -ым элементом modifiedtable вы можете заменить четвертый аргумент в Partition на что-то вроде {k,1} для некоторого значения k, но, вероятно, его прощеt бросить первые m элементы modifiedtable заранее, то есть

DoubleModifiedTable = 
 With[{n = 5, m = 10}, 
  Flatten[Partition[Drop[modifiedtable, m], n, n + m, 1, {}], 1]]
1 голос
/ 03 сентября 2011
DoubleModifiedTable=
modifiedtable[[
  Complement[
   Range[Length[modifiedtable]],
   Flatten@Table[10 i + j, {i, Floor[Length[modifiedtable]/10]}, {j, 5}]
  ]
]]

или, чуть короче

DoubleModifiedTable=
#[[
    Complement[
       Range[Length[#]],
       Flatten@Table[10 i + j, {i, Floor[Length[#]/10]}, {j, 5}]
     ]
 ]] & @ modifiedtable
...