我有两个问题,
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”上工作,但是其余的工作呢? 在上述代码中实现计数器的任何其他想法也是受欢迎的。
答案 0 :(得分:5)
删除了第一个问题的答案,因为我可能不理解你想要的内容。
至于第二个问题:我不确定我是否完全理解你。如果计数器属于坐标集,则输出应该保持不变,它看起来多么笨拙。如果计数器列只是最终输出的行计数器,则可以像以前一样完成扁平化后放入。
但在这种情况下,似乎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 pi / 180。如果这是你的意图,那就错了。转换为2 pi / 360或pi / 180。然后应将((xcord - 90)*2*3.14)/180
写为(xcord - 90)Degree
。
答案 1 :(得分:4)
问题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 :(得分:2)
在没有计数器的情况下创建表的其余部分,使用n*1
为索引创建合适的Range
矩阵,然后将MapThread
与内部函数Join
一起使用把两者放在一起。
答案 3 :(得分:1)
您的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]