0

我有一个问题可以分为两个子问题。我创建了一个表格,其代码如下所示。

问题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}}**/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}}** /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}}** /{52, 53, 59, 58, 70, 71, 77, 76}, {53, 54, 60, 59, 71, 72, 78, 77}}**/{52, 53, 59, 58, 70, 71, 77, 76}, {53, 54, 60, 59, 71, 72, 78, 77}}**/

现在,如果您观察到,我希望前十个元素( 的第 1 到第 10 个元素modifiedtable)出现在我的决赛桌 ( DoubleModifiedTable) 中。modifiedtable删除接下来的五个(第 11 到第 15 个元素)。然后接下来的十个元素(第 16 到第 25 个元素modifiedtable)出现在我的最终表格中(DoubleModifiedTable),然后接下来的五个被删除(第 26 到第 30 个元素modifiedtable)等等整个表格。

假设我们解决了这个问题并命名了决赛桌DoubleModifiedTable

我基本上对获得DoubleModifiedTable. 我决定将问题细分,因为它易于解释。

我希望这通过表格自动发生,因为这只是一个示例表格,但实际上我有很大的表格。如果我能理解如何为这张桌子解决这个问题,那么我也可以为我的大桌子解决这个问题。

4

3 回答 3

4

也许更简单:

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]]}]]
于 2011-09-02T21:42:44.467 回答
3

另一种方法是做类似的事情

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,然后将这些子列表展平以形成最终列表。如果您查看分区文档,您可以看到我使用的是第 6 种形式,Partition这意味着子列表的长度是n和偏移量(距离是n+m。因此,子列表之间的间隙是n+m-n==m.

下一个参数 ,1实际上等价于{1,1}告诉 Mathematica 的第一个元素modifiedtable应该出现在第一个子列表的位置 1 上,而 的最后一个元素modifiedtable应该出现在最后一个子列表的位置 1 上或之后。

最后一个参数{}是指示不应该对具有长度的子列表使用填充<=n

总之,如果要删除前 10 个元素并保留接下来的 5 个元素,则需要长度n=5为 gap的子列表m=10(m+1)由于您希望第一个子列表以 的-th 元素开头,因此modifiedtable您可以将 in 的第四个参数替换为某些值Partition的形式,但预先删除的第一个元素可能更容易,即{k,1}kmmodifiedtable

DoubleModifiedTable = 
 With[{n = 5, m = 10}, 
  Flatten[Partition[Drop[modifiedtable, m], n, n + m, 1, {}], 1]]
于 2011-09-02T21:10:58.823 回答
1
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
于 2011-09-02T21:00:32.397 回答