我们有零(42,42)、一(42,42)、inf(42,42)、nan(42,42)...
我们可以创建一个不初始化的数组,然后用数字填充它吗?我知道这不可能是代码分析器可以证明其安全性的好代码。但如果数组很大,这可以节省一些计算。
最佳答案
不存在固定大小的空数组。如果您稍后开始填充数组的元素,并为元素 [k1, k2]
赋值,那么您将拥有一个大小至少为 的数组[k1, k2]
,全部为 double (默认情况下)。原因是 matlab 数组是同构容器,因此每个元素都必须是适当的 double 型(或数组的相应类型)。迟早,你的数组必须被分配,如果未分配的元素则为零。对于满矩阵,最有效的做法是预分配,这就是zeros(k1max,k2max)
的作用。实际上,至少在旧版本的 MATLAB 中,使用 mymat(k1max,k2max)=0;
预分配速度更快,即通过为数组的右下角分配一个零(这会自动预分配该元素和 [1,1]
之间的所有其他元素。预分配的另一个好处是 MATLAB 可以立即为整个数组保留一个连续的内存块,这是最有效的方案。
您可能正在寻找的是稀疏数组。对于具有大量零元素的大型数组,将所有这些零存储在内存中并对它们执行计算效率很低。 MATLAB 自然地对待 sparse
数组,其中仅存储非零元素(对于每一列,因此存在一些开销),这会在非常稀疏的矩阵(其中非零元素的数量远小于矩阵的总数)的情况下带来巨大的内存效率和性能提升元素)。
稀疏矩阵的一个重要优点是所有算术运算和几乎所有矩阵运算都是为它们实现的,或者至少它们会自动转换为完整矩阵。这使得它们的使用几乎与完整矩阵相同。根据您的问题,您只存储非零元素。显然,只有当矩阵足够稀疏时,这才是有效的,否则元素簿记(并且不使用完全矢量化矩阵运算)的开销将使它们的使用效率低下。
最后一点,我只想指出,您可以创建空 double 组,只要其中一个维度为零即可:
>> 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.
但这很少在实际应用中占有一席之地。
关于matlab - 我们可以创建一个固定大小的数组而不进行初始化吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034088/