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

标签 wolfram-mathematica

我以前没有使用过 PackedArray,但今天从阅读有关它们的一些讨论中开始考虑使用它们。

我拥有的是大量所有实数的大型一维和二维矩阵,没有符号(它是一个有限差分 PDE 求解器),所以我认为我应该利用使用 PackedArray。

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

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

例如,这个 返回压缩数组

a = Table[RandomReal[], {5}, {5}];
Developer`PackedArrayQ[a]

但是这个
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[0, {5}, {5}];
b = a.a;
Developer`PackedArrayQ[b]

但是元素明智的乘法
b = a*a;
Developer`PackedArrayQ[b]

我的问题:是否有一个列表可以记录哪些 M 命令返回 PackedArray 与不返回? (假设数据符合要求,如Real、not mix、nosymbolic等。)

另外,一个小问题,您认为在调用 ToPackedArray 之前先检查创建的列表/矩阵是否已经打包会更好吗?在上面?我想打电话 ToPackedArray list 上已经打包不会花费任何费用,因为调用将立即返回。

谢谢,

更新 (1)

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

最佳答案

没有一个完整的列表。指出几点:

  • 压缩数组的基本操作将倾向于保持压缩:


  • In[66]:= a = RandomReal[1, {5, 5}];

    In[67]:= Developer`PackedArrayQ/@ {a, a.a, a*a}

    出[67]= {真,真,真}
  • 请注意,我的版本 (8.0.4) 不会为逐元素乘法解包。
  • 是否Table将导致压缩数组取决于元素的数量:


  • In[71]:= Developer`PackedArrayQ[Table[RandomReal[], {24}, {10}]]

    出[71]=假

    In[72]:= Developer`PackedArrayQ[Table[RandomReal[], {24}, {11}]]

    输出[72]=真

    In[73]:= Developer`PackedArrayQ[Table[RandomReal[], {25}, {10}]]

    输出[73]=真
  • On["Packing"]将打开消息让您知道什么时候东西打开:


  • In[77]:= On["包装"]

    在[78]:= a = RandomReal[1, 10];

    In[79]:= Developer`PackedArrayQ[a]

    输出[79]=真

    In[80]:= a[[1]] = 0 (* 由于类型不匹配而强制解包 *)

    Developer`FromPackedArray::punpack1:解包维度为 {10} 的数组。 >>

    输出[80]= 0
  • 执行每个元素检查的操作通常会解压数组,

  • 在[81]:= a = RandomReal[1, 10];

    In[82]:= Position[a, Max[a]]

    Developer`FromPackedArray::unpack:在调用 Position 时解包数组。 >>

    出[82]= {{4}}
  • 打电话有罚款ToPackedArray已经打包的 list 足够小,我不会太担心:

  • In[90]:= a = RandomReal[1, 10^7];

    In[91]:= Timing[Do[Identity[a], {10^5}];]

    出[91]= {0.028089,空}

    In[92]:= Timing[Do[Developer`ToPackedArray[a], {10^5}];]

    输出 [92]= {0.043788,空}

  • 前端更喜欢打包而不是未打包的数组,这在处理 Dynamic 时会出现。和 Manipulate :

  • In[97]:= Developer`PackedArrayQ[{1}]

    出[97]=假

    In[98]:= 动态[Developer`PackedArrayQ[{1}]]

    输出[98]=真
  • 在研究性能时,请关注大列表被解包的情况,而不是小列表。除非小的在大循环中。
  • 关于wolfram-mathematica - 在 PackedArray 上,寻找使用它们的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8775372/

    相关文章:

    wolfram-mathematica - 如何计算 BezierFunction[] 的 x 分量的倒数?

    math - 如何通过绘制方程的实部和虚部来确定方程的根

    eclipse - 有没有办法在 Wolfram Workbench 2.0 中输入希腊字母?

    documentation - Mathematica : Function Documentation

    wolfram-mathematica - 优化游戏生活

    parsing - 如何在粘贴时自动转换 Part [[ 双括号 ]]?

    algorithm - 具有指定边长的图形的 Spring /静电绘图的实现

    wolfram-mathematica - 使用 Mathematica 求两个函数的交集

    autocomplete - Mathematica 10 中有括号自动补全功能吗?

    python - 为什么 NumPy 在对零填充数组求和时给出不同的结果?