我以前没有使用过 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]= {真,真,真}
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/