Wolfram mathematica “数学”;附于「;函数问题

Wolfram mathematica “数学”;附于「;函数问题,wolfram-mathematica,Wolfram Mathematica,我是Mathematica的新手,在向数据表添加列时遇到了一个重大故障。我在Vista中运行Mathematica 7。我在这里询问之前花了很多时间进行RFD 我有一个三列五行的数据表(mydata)。我试图向表中添加两个包含五个元素的列表(有效地向数据表中添加两列) 这非常有效: 使用:mydata//TableForm打印出表格将显示添加的列 但是,当我尝试添加第二个列表时 Table[AppendTo[mydata[[i]],mysecondlist[[i]]],{i,5}] 要么Mat

我是Mathematica的新手,在向数据表添加列时遇到了一个重大故障。我在Vista中运行Mathematica 7。我在这里询问之前花了很多时间进行RFD

我有一个三列五行的数据表(mydata)。我试图向表中添加两个包含五个元素的列表(有效地向数据表中添加两列)

这非常有效:

使用:
mydata//TableForm
打印出表格将显示添加的列

但是,当我尝试添加第二个列表时

Table[AppendTo[mydata[[i]],mysecondlist[[i]]],{i,5}]
要么Mathematica崩溃了(!),要么我得到了大量的
Part::partw
Part::spec
错误,说第5部分不存在

但是,在所有错误消息之后(如果Mathematica没有崩溃),再次打印数据表时使用:
mydata//TableForm
显示的数据表有五列,与我预期的一样。修改后的数据表上的所有
TableForm
格式选项都可以正常工作


谁能告诉我我做错了什么?提前谢谢

我试图重现这一点,但失败了。我在Windows XP上运行Mma 8;看起来差别并不重要,但谁知道呢?我说,接二连三,

myData = {{1, 2, 3}, {2, 3, 4}, {8, 9, 10}, {1, 1, 1}, {2, 2, 2}}
myFirstList = {9, 9, 9, 9, 9}
mySecondList = {6, 6, 6, 6, 6}
Table[AppendTo[myData[[i]], myFirstList[[i]]], {i, 4}]
Table[AppendTo[myData[[i]], mySecondList[[i]]], {i, 5}]
myData // TableForm
并得到(0)没有崩溃,(1)没有错误或警告,(2)我期望的输出。(注意:我在第一组附录的限制中使用了4而不是5,就像在你的问题中一样,以防引起麻烦。)


Mma文档声称
AppendTo[a,b]
总是等同于
a=Append[a,b]
,这表明它没有修改列表。但我想知道AppendTo是否有时会在认为安全的情况下修改列表;然后,如果它认为它是安全的,而它不是,可能会有恶劣的后果。如果将
Append
替换为
Append
+普通赋值,是否还会出现奇怪的错误消息和崩溃?

这里有几点要介绍。首先,下面的代码没有给我任何错误,所以这里可能发生了其他事情。也许您应该发布产生错误的完整代码块

mydata = Array[Subscript[{##}] &, {5, 3}];
myfirstlist = Range[1, 5];
mysecondlist = Range[6, 10];

Table[AppendTo[mydata[[i]], myfirstlist[[i]]], {i, 4}];
mydata // TableForm

Table[AppendTo[mydata[[i]], mysecondlist[[i]]], {i, 5}];
mydata // TableForm
其次,在这里使用
没有任何意义,因为您直接修改
mydata
<代码>表格将无意义地使用内存

第三,有更好的方法来完成这项任务

看到和

我必须收回我的明确声明,即有更好的方法。将
Table
更改为
Do
并运行一些快速测试后,对于某些数据来说,这似乎是一种有竞争力的方法

我使用的是Mathematica 7,所以这似乎不是问题。

如前所述,在列表中添加列是有必要的,而且,我似乎无法在v上重现这个问题。7.但是,我想把重点放在错误本身上,看看我们是否可以这样纠正它。当Mathematica生成消息
Part::partw
时,它会吐出一部分有问题的列表,如

Range[1000][[1001]]
Part::partw: Part 1001 of  
    {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
    31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,<<950>>} 
    does not exist.
范围[1000][[1001]]
零件号:零件号:第1001部分
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,} 
不存在。

所以,我要问的问题是,哪个列表给了我这些问题?我最好的猜测是它是
mysecondlist
,我会检查
Length@mysecondlist
,看看它是否真的有5个元素长。

让我们试着澄清一下双转置方法是由什么组成的。我对这种方法的独创性没有任何要求。我的重点是阐述的清晰性

让我们从5个列表开始。首先我们在一张桌子里放三个。然后我们再加上最后两个

food = {"bagels", "lox", "cream cheese", "coffee", "blueberries"};
mammals = {"fisher cat", "weasel", "skunk", "raccon", "squirrel"};
painters = {"Picasso", "Rembrandt", "Klee", "Rousseau", "Warhol"};
countries = {"Brazil", "Portugal", "Azores", "Guinea Bissau", 
             "Cape Verde"};
sports = {"golf", "badminton", "football", "tennis", "rugby"};
前三个列表——食物、哺乳动物、画家——成为
lists3
的元素。它们只是列表,但是
TableForm
将它们显示在表中,作为

(lists3 = {food, mammals, painters}) // TableForm

mydata
将是
lists3
的转置名称。现在这三个列表显示为列。这就是换位的作用:列和行被切换

(mydata = Transpose@lists3) // TableForm

这就是问题真正开始的地方。我们如何添加两个附加列(即国家和体育的列表)?让我们来处理剩下的两个列表

(lists2 = {countries, sports}) // TableForm

所以我们可以加入
转置[mydata]
列表2

(lists5 = Join[Transpose[mydata], lists2]) // TableForm

[或者,我们可能有
Join
ed
lists3
lists2
,因为第二个换位,
mydata
的换位撤销了先前的换位。
lists3
只是
mydata
的换位(反之亦然)。]

现在,我们只需对结果进行
转置
即可获得所需的五个列表的最终表格,每个列表都有自己的列:

Transpose@lists5 // TableForm


我希望这有助于了解如何向表中添加两列。我觉得这条路相当清楚。你可能会发现其他更清晰的方法。

好吧,这是我的两分钱,我相信这是一个非常快速且最容易理解的结构

首先,一些测试阵列:

m = RandomInteger[100, {2000, 10000}];
l1 = RandomInteger[100, 2000];
l2 = RandomInteger[100, 2000];
{r, c} = Dimensions[m];
我稍微增加了测试阵列的大小,以提高以下计时测量的准确性

该方法涉及调用
Part
([…])、
All
Span
(;)的幂

基本上,在添加两列之后,我使用数据数组的未来维度建立了一个新的工作矩阵,然后使用
All
Span
添加原始矩阵,并仅使用
All
添加附加列。然后我将废弃矩阵复制回原始矩阵,因为其他方法也会返回修改后的数据矩阵

n = ConstantArray[0, {r, c} + {0, 2}];
n[[All, 1 ;; c]] = m;
n[[All, c + 1]] = l1;
n[[All, c + 2]] = l2;
m = n;
至于时间安排:

Mean[
 Table[
  First[
   AbsoluteTiming[
    n2 = ConstantArray[0, {r, c} + {0, 2}];
    n2[[All, 1 ;; c]] = m;
    n2[[All, c + 1]] = l1;
    n2[[All, c + 2]] = l2;
    m2 = n2;
    ]
   ],
  {10}
  ]
 ]

0.1056061
(平均10次)

另一种建议的Do(和OP)方法:

结果是一样的:

n = ConstantArray[0, {r, c} + {0, 2}]; n[[All, 1 ;; c]] = m; n[[All, c + 1]] = l1; n[[All, c + 2]] = l2; m = n;
Mean[
 Table[
  First[
   AbsoluteTiming[
    n2 = ConstantArray[0, {r, c} + {0, 2}];
    n2[[All, 1 ;; c]] = m;
    n2[[All, c + 1]] = l1;
    n2[[All, c + 2]] = l2;
    m2 = n2;
    ]
   ],
  {10}
  ]
 ]

0.1056061
Mean[
 Table[
  n1 = m;
  First[
   AbsoluteTiming[
    Do[AppendTo[n1[[i]], l1[[i]]], {i, 2000}]; 
    Do[AppendTo[n1[[i]], l2[[i]]], {i, 2000}];
    ]
   ],
  {10}
  ]
 ]

0.4898280
In[9]:= n2 == n1

Out[9]= True