问题标签 [pre-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
362 浏览

matlab - 我想要关于如何优化我的代码的建议。执行时间过长

我编写了一个 MATLAB 代码,用于从 SAC(地震)文件(通过另一个代码读取)中查找地震信号(例如 P 波)。该算法称为 STA/LTA ​​触发算法(实际上对我的问题并不重要)

重要的是,实际上这段代码运行良好,但由于我的地震文件太大(1GB,即两个月),执行需要将近 40 分钟才能看到结果。因此,我觉得有必要优化代码。

我听说用高级函数替换循环会有所帮助,但由于我是 MATLAB 的新手,我不知道如何去做,因为代码的目的是扫描每个时间序列。另外,我听说预分配可能会有所帮助,但我只知道如何实际执行此操作。

由于此代码是关于地震学的,因此可能难以理解,但我在顶部的注释可能会有所帮助。我希望我能在这里得到有用的建议。以下是我的代码。

0 投票
2 回答
1761 浏览

python - python数组初始化(预分配)与nans

我想初始化一个包含一些数据的数组。我创建了一个随机矩阵(使用np.empty),然后将其乘以np.nan. 这有什么问题吗?还是我应该坚持更好的做法?

进一步解释我的情况:我有需要存储在数组中的数据。假设我有 8 行数据。每行的元素个数不相等,所以我的矩阵行长度需要和最长的行一样长。在其他行中,某些元素不会被填充。我不想使用零,因为我的一些数据实际上可能是零。

我意识到我可以使用一些我知道我的数据永远不会使用的值,但 nans 肯定更清晰。只是想知道这是否会导致以后的处理出现任何问题。我意识到我需要使用nanmax而不是max等等。

0 投票
1 回答
481 浏览

labview - 如果 VI 在 FOR 循环中,预分配克隆是否只分配一个克隆?

在参加 CLD-R 之前,我正在阅读样本试卷。

我遇到了如下所示的可重入问题:

在此处输入图像描述

答案是4。

文档中没有具体提及 for 循环中的预分配。

“预分配”意味着对于每个调用,我们都会为该调用创建一个数据空间并进行克隆。

以上建议答案是 6,总共有 6 个调用,但答案是 4。这是否意味着在 FOR 循环中只为 VI 分配了一个克隆?

0 投票
1 回答
71 浏览

.net - 预分配 .NET 数组矩阵

我正在使用 Matlab 为实验设置数据采集过程,该功能ain.DAQbufferGet是从我们的硬件读取数据的功能。它包含一系列数据点,例如[-200,-160,10,50,-20,40,170,160,-200... etc].

问题是 DAQbufferGet 的输出是1x1 System.Int16[]

这样的输出也可以通过使用

这里50000只是一个示例编号

我想将 DAQbufferGet 的输出存储在矩阵中,而不必将其转换为不同的数据类型,并且能够稍后(在循环外)绘制它,如下所示:

1x1 System.Int16[]我很难用数据类型做类似的事情

我该怎么做?

具体来说,预分配一个 .NET 数组矩阵,稍后可以在上述 for 循环中写入该矩阵。

0 投票
1 回答
113 浏览

matlab - MATLAB:不断增长的哈希表

我在代码中使用哈希表,当代码运行时,我将键和值添加到哈希表中。起初,我认为使用哈希表可以让我的代码更快,但我错了,使用哈希表让它变慢了。当我搜索它时,我意识到增加哈希表的大小并编写它需要时间,因为当它变大时,MATLAB 会寻找更大的空间,而寻找更大的空间会浪费时间。

MATLAB中的哈希表是否有任何预分配方法?

谢谢。

0 投票
1 回答
444 浏览

arrays - 为对象数组预分配内存

我有一个自定义类ClassA,我想创建一个空对象数组N来存储N ClassA对象。

现在我正在使用一个空单元格数组cellarrayA = cell(N,1),并将每个对象放入单元格中,例如cellarrayA(n) = ClassA(input(n)). 完成后,我使用 . 将单元格数组转换为对象数组objarrayA = [cellarrayA{:}]

它可以工作(Matlab 没有抱怨),但我认为它实际上并没有预先分配正确的内存量,因为元胞数组如何在创建对象之前知道我的对象的大小?我的对象的大小可能相当大,大约为 1MB(但可能会有所不同)。我想我可能会遭受同样的性能损失,就像我根本没有预分配任何东西一样,尽管我无法验证它。那么如何预先分配对象数组,而不是使用元胞数组呢?

0 投票
1 回答
92 浏览

matlab - 如何在 Matlab 中预先分配结构向量

在 matlab 中,函数 struct 允许预先分配这样的结构

但是我需要 S 是一个长度为 100 的结构向量,我不知道该怎么做。我想这样做,以便稍后我可以分配

没有使 S 由于分配而改变大小。

0 投票
1 回答
497 浏览

size - 嵌入式函数中的可变大小元素,但输入和输出固定

我的 simulink 嵌入函数有一个固定的输入和输出。但是我想在函数内部计算一个可变大小的元素(仅用于计算)。

因此,我不希望将该块声明为接收或发送动态大小信号。(或使用 coder.varsize)

前任:

这里的变量 G 总是固定的......但我有这种类型的错误:

感谢您的时间。

0 投票
1 回答
280 浏览

message-queue - 父子VI中的队列消息处理VI,其执行类型设置为预分配(?)

我正在通过 LabVIEW 创建一个通信服务器的示例。 在此处输入图像描述

在主 VI 中,我有一个服务器和客户端:最后一个执行设置为预分配克隆可重入。我使用队列消息处理程序在服务器和客户端之间传输消息和命令。

下图是突出显示的Queued Message SubVIs的客户端 VI(预分配的克隆可重入执行)。在我之前的问题中,我询问了客户端 VI(预分配)中子 VI 的执行类型,得到的答案是子 VI 也需要预分配。但现在我的问题是关于队列消息处理程序模板 VI。我应该将队列消息处理程序模板VI的执行类型设置为与父VI相同吗?

在此处输入图像描述

谢谢

0 投票
1 回答
231 浏览

matlab - 是否可以使用 gpuArray 预分配一个数组,并在 mexcuda 设置中对其具有写权限?

我在 MatLab (2018a) 中编写了一段代码,它是标准 matlab 代码和 CUDA 代码的混合体,我使用编译与 mexcuda 将其链接起来。我的代码中的核心循环包含一个矩阵的插值,比如从大小 [nxm] 到 [N x M]。我已经使用 GPU 加快了这部分的速度。由于此插值在循环内,并且由于我插值的矩阵的大小(之前和之后)在循环的每次迭代中都是相同的,我想通过预先分配输出大小的数组来加速应用程序显卡。所以我想做类似的事情:zeros(N,M,'gpuArray')在开始时,将它作为输入提供给 mexFunction,然后将插值矩阵写入这个数组。这将节省相当多的分配时间([N_iterations-1]*allocation_time,粗略地说)。

我现在的问题是:我不知道这是否可能。使用 mexFunction() 作为入口点,我知道检索输入数组的唯一方法是使用以下内容:

但是,顾名思义,这会导致只读权限。我不能使用mxGPUGetData(in),因为 mxGPUArray 是const,不能用它初始化非常量实体。有谁知道是否有解决这个问题的方法不涉及在 mexFunction 内分配数组?

编辑:

下面的代码显示了两个 C 代码示例,其中第一个是我当前代码的类比,第二个是我正在努力的目标:

当前的:

主意:

以上两个是(至少在我看来)以下 matlab-cuda 混合代码的类比:

当前(matlab);mexcuda 函数需要为 input(:,:,indx) 的插值分配内存

想法:内存分配被移出 mexcuda 函数(因此,移出核心循环),并且 mexcuda 函数只需要检索指向这个(可写)数组的指针;

请注意,确实有可能进一步并行化:如前所述,我正处于并行化整个事物的中间步骤。