我们可以创建一个没有初始化的固定大小的数组

时间:2016-06-26 00:13:29

标签: matlab

我们有零(42,42),其中(42,42),inf(42,42),nan(42,42)......

我们可以创建一个没有初始化的数组,然后用数字填充它吗?我知道这不是代码分析器可以证明其安全性的好代码。但是如果数组很大,这可以节省一些计算。

1 个答案:

答案 0 :(得分:3)

没有固定大小的空数组。如果您稍后开始填充数组的元素,并为元素[k1, k2]分配值,那么的数组大小至少为[k1, k2],所有双精度数(按默认)。原因是matlab数组是同类容器,因此每个元素必须是一个合适的double(或相应类型的数组)。迟早,必须分配您的数组,如果是未分配的元素,则为零。在完整矩阵的情况下,最有效的方法是 preallocate ,这是zeros(k1max,k2max)的作用。实际上,至少在旧版本的MATLAB中,使用mymat(k1max,k2max)=0;预分配更快,即通过在数组的右下角分配一个零(这会自动预先分配所有其他元素)那和[1,1]。预分配的另一个优点是MATLAB可以同时为整个阵列保留一个连续的内存块,这是最有效的场景。

您可能正在寻找的是稀疏数组。对于具有大量零元素的大型数组,将所有这些零存储在内存中并对它们执行计算是低效的。 MATLAB自然地处理sparse数组,其中只存储非零元素(对于每一列,因此存在一些开销),这导致巨大的内存效率和性能在非常稀疏的矩阵(非零元素的数量)的情况下增加比元素总数小得多。)

稀疏矩阵的一个重要优点是所有算术运算和几乎所有矩阵运算都是为它们实现的,或者至少它们被自动转换为完整矩阵。这使得它们的使用几乎与完整矩阵相同。根据您的问题,您只存储非零元素。显然,这只有在矩阵足够稀疏时才有效,否则元素簿记的开销(而不是使用完全向量化的矩阵运算)会使它们的使用效率低下。

作为最后的评论,我只想指出,只要其中一个维度为零,就可以创建空双数组:

>> double.empty(100,0)

ans =

   Empty matrix: 100-by-0

>> double.empty(100,100)
Error using double.empty
At least one dimension must be zero.

但这在实际应用中很少占有一席之地。