我最近遇到了以下情况:
int ( *array )[10] = malloc(...);
Run Code Online (Sandbox Code Playgroud)
基于我对C语法和语法的理解,这看起来像废话.看起来像正在创建(并初始化)一个数组,其中取消引用指针的值作为其标识符.
我理解指向数组的指针,并且通常至少使用malloc()在堆上分配它们.例如,这是有道理的:
int *array = malloc(sizeof (int*) * 10);
Run Code Online (Sandbox Code Playgroud)
...但是,第一个例子看起来像不应该编译的乱码.显然,我错过了一些东西.
当我学习C时,我觉得我看到了回来的东西,但谷歌搜索并没有帮助我理解.使用术语"指针","解除引用"和"初始化"进行搜索显然会给结果带来污染,这些结果会跟踪人们如何跟踪解除引用等等.我希望人类可以帮助我.
我主要对缩小这样一个数组的可行性感兴趣.
我正在开发一个项目,我使用单个malloc()调用来创建各个中等大小的2D数组.(每个只有几十个MiB,最大的.)问题是,在其中一个阵列的生命周期中,其内容大小缩小(超过一半).显然,我可以在程序的生命周期中单独保留数组大小.(它只有一个具有GiB RAM的系统上的x MiB.)但是,我们正在谈论超过一半的分配空间在程序终止之前就被废弃了,并且,由于我使用的方式的性质数组中,所有幸存数据都保存在一组连续的行中(在块的开头).如果我真的不需要它,那么抓住所有RAM似乎是浪费.
虽然我知道realloc()可用于缩小动态创建的数组,但2D数组更复杂.我想我理解它的内存布局(因为我实现了构造它的函数),但这推动了我对语言及其编译器工作的理解的极限.显然,我将不得不处理行(并处理行指针),而不仅仅是字节,但我不知道所有这些的结果是多么可预测.
而且,是的,我需要使用单个malloc()创建数组.有问题的对象有几百万行.我尝试分别使用一个循环到malloc()每一行,但程序总是冻结在大约100,000 malloc()s.
对于后台,我用来构造这些数组的源代码如下:
char ** alloc_2d_arr(int cnum, int rnum) {
/* ((bytes for row pointers + (bytes for data)) */
char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char));
/* Initialize each row pointer to the first cell of its row */
char *p = (char *) (mtx + rnum);
for (int i = 0; i < rnum; i++) {
mtx[i] = p + i * …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用scipy中的interp1d()来插入一些数据,但是我一直在输出out或range错误.经过几个小时的谷歌搜索,我现在知道x值不按递增顺序将导致我得到的相同错误,但我已经确定这不是问题.据我所知,看起来interp1d()不喜欢第一个值中的小数.我错过了什么吗?
我的问题的简化版本:
以下运行很好.
import numpy as np
from scipy.interpolate import interp1d
interp1d(np.array([1, 2, 3, 4, 5, 6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
Run Code Online (Sandbox Code Playgroud)
但是这个:
interp1d(np.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
Run Code Online (Sandbox Code Playgroud)
返回:
ValueError:x_new中的值低于插值范围.
但是,这很好用.
interp1d(np.array([1.0, 2.2, 3.3, 4.4, 5.5, 6.6]),
np.array([2, 4, 6, 8, 10, 12]), kind='cubic')(np.linspace(1, 6, num=40))
Run Code Online (Sandbox Code Playgroud) 执行中:
using Random
rng1 = MersenneTwister(42)
rng2 = MersenneTwister(42)
v = [ x for _ = 1:4, x = rand(rng1) ]
w = [ rand(rng2) for _ = 1:4 ]
print("$(v)\n$(w)\n")
Run Code Online (Sandbox Code Playgroud)
生成以下输出:
[0.533183、0.533183、0.533183、0.533183]
[0.533183、0.454029、0.0176868、0.172933]
两个序列不应该相同吗?我想念什么?
我在多个系统上都得到了相同的结果,而与是否创建vfirst或无关w。