Wolfram mathematica 在PackedArray上,寻找使用它们的建议

Wolfram mathematica 在PackedArray上,寻找使用它们的建议,wolfram-mathematica,Wolfram Mathematica,我以前没有使用过PackedArray,但今天在这里通过阅读一些关于它们的讨论,我才开始考虑使用它们 我有很多大尺寸的所有实数的1D和2D矩阵,没有符号(这是一个有限差分PDE解算器),所以我认为我应该利用PackedArray 我有一个初始化函数,在其中分配所需的所有数据/网格。所以我去用了topackedaray。它似乎快了一点,但我需要做更多的性能测试,以更好地比较前后的速度,并比较RAM的使用情况 但是当我看这个的时候,我注意到M中的一些操作已经自动返回PackedArray中的列表了,

我以前没有使用过PackedArray,但今天在这里通过阅读一些关于它们的讨论,我才开始考虑使用它们

我有很多大尺寸的所有实数的1D和2D矩阵,没有符号(这是一个有限差分PDE解算器),所以我认为我应该利用PackedArray

我有一个初始化函数,在其中分配所需的所有数据/网格。所以我去用了
topackedaray
。它似乎快了一点,但我需要做更多的性能测试,以更好地比较前后的速度,并比较RAM的使用情况

但是当我看这个的时候,我注意到M中的一些操作已经自动返回PackedArray中的列表了,而有些没有

例如,此不返回压缩数组

a = Table[RandomReal[], {5}, {5}];
Developer`PackedArrayQ[a]
a = Table[0, {5}, {5}];
b = a.a;
Developer`PackedArrayQ[b]
但是这个确实是

a = RandomReal[1, {5, 5}];
Developer`PackedArrayQ[a]
a = Table[0, {5}, {5}];
b = ListConvolve[ {{0, 1, 0}, {1, 4, 1}, {0, 1, 1}}, a, 1];
Developer`PackedArrayQ[b]
而这个确实

a = RandomReal[1, {5, 5}];
Developer`PackedArrayQ[a]
a = Table[0, {5}, {5}];
b = ListConvolve[ {{0, 1, 0}, {1, 4, 1}, {0, 1, 1}}, a, 1];
Developer`PackedArrayQ[b]
而且矩阵乘法在压缩数组中返回结果

a = Table[RandomReal[], {5}, {5}];
Developer`PackedArrayQ[a]
a = Table[0, {5}, {5}];
b = a.a;
Developer`PackedArrayQ[b]
但是元素级乘法并不

b = a*a;
Developer`PackedArrayQ[b]
我的问题:是否有一个列表,列出哪些M命令返回的文档是PackedArray还是not?(假设数据满足要求,如真实、不混合、无符号等)

还有一个小问题,您认为在调用
ToPackedArray
之前,最好先检查创建的列表/矩阵是否已打包?我认为在已经打包的列表中调用
ToPackedArray
不会花费任何费用,因为调用将立即返回

谢谢

更新(1)


只是想提一下,我发现在演示CDF中不允许使用PackedArray符号,因为我上传一个一个的错误。所以,我不得不把我所有的包装代码都去掉。由于我主要写演示,现在这个话题对我来说只是一个学术兴趣。但我想感谢大家的时间和良好的回答。

没有一个全面的列表。要指出几件事:

  • 使用压缩阵列的基本操作将倾向于保持压缩:
  • [“打包”]上的
    将打开消息,让您知道物品何时解包:
  • 与未打包的数组相比,前端更喜欢打包的数组,在处理
    动态
    操纵
    时,会显示这些数组:
在[97]:=Developer`PackedArrayQ[{1}] Out[97]=假 在[98]:=Dynamic[Developer`PackedArrayQ[{1}]] Out[98]=正确
  • 在研究性能时,请关注大列表被解包的情况,而不是小列表。除非小的在大的环中

    • 这只是对以下内容的补充:

      将给出函数返回压缩数组所用的长度。因此,如果您确实需要打包一个小列表,作为使用
      Developer`ToPackedArray
      的替代方法,您可以临时为其中一个编译选项设置一个较小的数字。e、 g

      SetSystemOptions["CompileOptions" -> {"TableCompileLength" -> 20}]
      
      请注意,函数之间存在一些差异,至少对我来说,这些差异似乎不是直观的,因此每当我使用这些函数时,我通常都必须测试它们,而不是本能地知道哪些函数工作得最好:

      f = # + 1 &;
      g[x_] := x + 1;
      data = RandomReal[1, 10^6];
      
      On["Packing"]
      Timing[Developer`PackedArrayQ[f /@ data]]
      {0.131565, True}
      
      
      Timing[Developer`PackedArrayQ[g /@ data]]
      Developer`FromPackedArray::punpack1: Unpacking array with dimensions {1000000}.
      {1.95083, False}
      

      Brett回答的另一个补充:如果列表是压缩数组,那么ToPackedArray非常快,因为它很早就检查过了。此外,您可能会发现这一点很有价值:

      一般来说,对于数字方面的内容,请查看Rob Knapp和/或Mark Sofroniou的谈话

      当我开发数字代码时,我编写函数,然后在[“打包”]上使用,以确保所有需要打包的东西都打包好了


      关于Mike的回答,引入了阈值,因为对于小的东西有开销。其中阈值取决于硬件。编写一个函数,根据计算机上的测量值设置这些阈值可能是个好主意。

      当我在[“packing”]上使用
      。像这样
      FromPackedArray::punpackkl1:将维度为{5,5,2}的数组解包到第2级。
      但是没有行号和其他任何东西,我需要找到是否有一种简单的方法来找到它们的来源,并看看我是否可以更改代码以避免解包?仅仅是在没有来自M的帮助的情况下发出的消息是不太有用的。我有7000行代码。但这只是一个开始。我现在有更多的工作要做:)thanks@NasserM.Abbasi,分析您的代码,找到消耗时间最多的函数,首先修复这些函数;我相信你没有一个函数有7克代码;-)@ruebenko,谢谢,但我不知道如何在M中分析代码。这是一个大单元。这是一个演示,它是一个大单元。我不知道如何使用工作台来运行操作。它还取决于UI输入,代码运行的路径不同。但问题是,如果M只告诉至少错误来自的函数名,这会有所帮助。没有行号,其他什么都没有,这些信息对我来说毫无用处,因为很难知道它们是从哪里来的。你能详细介绍一下演示CDF中不允许使用的PackedArray符号吗。也许举个例子?这是我感兴趣的。嗨,我只是做了一个小演示(演示样式表等…),只是做了一个小操作,并在其中使用了
      ToPackedArray[Table[0,{10}]]
      ,然后将其上载到我的WRI创作区以生成演示CDF,但WRI上载器(在上载之前验证演示文件)拒绝它,说不允许使用
      PackedArray
      符号。所以基本上这个包不允许在演示中使用。你可以自己试试。我相信有很好的理由来解释,安全,支持等等。。。但归根结底,PackedArray至少目前还不能用于WRI演示,所以这看起来像Wolfram正在进行的某种筛选,而不是CDF中该功能的全面屏蔽。这看起来很奇怪,它是c
      SystemOptions["CompileOptions"]
      
      SetSystemOptions["CompileOptions" -> {"TableCompileLength" -> 20}]
      
      f = # + 1 &;
      g[x_] := x + 1;
      data = RandomReal[1, 10^6];
      
      On["Packing"]
      Timing[Developer`PackedArrayQ[f /@ data]]
      {0.131565, True}
      
      
      Timing[Developer`PackedArrayQ[g /@ data]]
      Developer`FromPackedArray::punpack1: Unpacking array with dimensions {1000000}.
      {1.95083, False}