如何在许多元素始终为0的数组中保存内存?

时间:2018-07-06 02:50:22

标签: c tensor

我在C中有一个2张量,看起来像:

int n =4;
int l =5;
int p =6;
int q=2;

然后我初始化T的每个元素

//loop over each of the above indices
T[n][l][p][q]=...

但是,其中许多都是零,并且存在诸如这样的对称性。

T[4][3][2][1]=-T[3][4][2][1]
  1. 如何在T的零元素上保存内存?理想情况下,我想在这些位置放置类似NULL的东西,以便它们使用0而不是8个字节。另外,在计算的稍后部分,我可以通过检查它们是否等于NULL
  2. 来检查它们是否为零。
  3. 如何使用过多的内存在T中隐式包含这些对称性?

编辑:对称性可以通过其他实现方式解决。但是零呢?有什么实现方法可以避免浪费内存吗?

1 个答案:

答案 0 :(得分:1)

您不能通过写入变量的值来影响任何变量的大小。
如果要节省内存,则不仅要不使用它,还不必使用它定义变量。
如果不定义变量,则不必使用它。
这样就保存了内存。
这当然是显而易见的。

现在,如何将其应用于您的问题。
首先,请允许我简化一下,因为您没有提供足够的信息和解释,至少不能让我理解每个细节。另外,为了使说明简单。
因此,希望我能为您解决以下问题就足够了,我认为这是您问题的小弟弟。

我在C中有一个大型数组(不是很大,可以说N个条目,N == 20)。
但是出于特殊原因,我永远不需要真正读写偶数索引,它们应该像包含0一样工作,但是我想保存它们使用的内存。
所以实际上我只想使用M个条目,其中M * 2 == N。

所以不是

int Array[N]; /* all the theoretical elements */

我定义

int Array[M]; /* only the actually used elements */

当然,我无法访问不需要的任何元素,并且实际上不是必需的。
但是出于我程序的逻辑,我希望能够像访问它们一样进行编程,但是请确保它们始终始终仅读取0并忽略任何写入的值。

所以我要做的是包装对数组的所有访问。

int GetArray(int index)
{
    if (index & 1)
    {
        /* odd, I need to really access the array,
           but at a calculated index */
        return Array[index/2];
    } else
    {
        /* even, always 0 */
        return 0;
    }
}

void SetArray(int index, int value)
{
    if (index & 1)
    {
        /* odd, I need to really access the array,
           but at a calculated index */ */
        Array[index/2] = value;
    } else
    {
        /* even, no need to store anything, stays always "0" */
    }
}

因此,我可以像数组的两倍大一样进行读写,但要保证永远不要使用伪造的元素。
并通过将索引映射为
Actualindex = wantindex / 2
我确保我访问的空间不会超出实际存在的数组的大小。

现在将这个概念移植到您描述的更复杂的设置中是您的工作。您了解所有细节,可以测试一切是否正常。

我建议通过检查结果索引来扩展GetArray()和SetArray(),以确保它永远不在实际数组之外。
您还可以添加各种自我检查,以验证是否满足所有规则和期望。