问题标签 [accumarray]

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 投票
2 回答
155 浏览

matlab - matlab - Accumarray 邻接矩阵混淆?

所以我试图创建一个邻接矩阵,我对 和 之间的区别感到accumarray(matrix+1,1)困惑accumarray(matrix,1)

我做了:

接着:

我知道对于“矩阵+1”,有一个额外的行和零列,但我不明白你为什么要那样做。当我查找它时,根据这篇文章,我应该使用“matrix+1”,对此我得到的最好解释是“因为 matlab 中的索引从 1 开始”。

我根本不明白......如果我试图创建一个邻接矩阵,哪种方式是正确的?任何帮助将不胜感激,谢谢!

0 投票
3 回答
96 浏览

arrays - 使用带有 accumarray 的百分比函数

我有两个数组:

对于 OTPCORorder 中的每个元素,在 AprefCOR 中都有一个对应的元素。我想知道每组唯一 OTPCORorder 的数字 1 的百分比如下:

我已经有了这个:

我曾经使用“accumarray”,但我使用了“mean”或“sum”函数,例如:

我只是想知道是否有一种方法可以使用它,但使用“prctile”函数或任何其他函数,可以为我提供特定元素的百分比,例如在这种情况下为“1”。

非常感谢。

0 投票
1 回答
100 浏览

matlab - 使用 accumarray 进行矢量化

我想将 3D 表面(CylCoors 300000x3)的纹理投影到 2D 平面(Image380x360)中。为此,我采用 Z ( UniqueZ=unique(CylCoors(:,3))) 和 Theta ( UniqueTheta=unique(CylCoors(:,1))) 中的每个唯一值,并投影所有纹理值 ( PointValues 300000x1 ),它们都像这样相遇:

这是一个带有修剪变量的示例:

有没有办法使用矢量化for循环accumarray?有些东西告诉我情况就是这样,但我发现这个函数的多维子索引相当混乱。

也欢迎任何其他矢量化解决方案(使用 、 和我假设的智能组合reshapebsxfunsum但我真的很想accumarray更好地理解这种用法​​。

0 投票
3 回答
411 浏览

arrays - 让 accumarray 输出一个表

accumarray使用两行索引创建一个矩阵,其元素位于有效索引对的位置,其值由指定函数分配,例如:

这种方式datamatrix将是一个20x20带有值的矩阵。A然而,如果和的值B非常大,这将导致一个大部分为空的矩阵,在远角有一小批数据。为了规避这一点,可以设置accumarrayissparse

这将节省大量内存以防万一min(A)和/或min(B)非常大。

然而,我的问题是我有一个Mx7矩阵,M~1e8我想在该矩阵上根据前两列的索引以及第三列的标准偏差收集第三列到第七列的平均值:

我想将其保存回一个表中,结构为[X Y Z std R G B I],其中XY是索引,Z是该像素的平均高度,RGBI每个像素的平均值(颜色和强度),std是高度的标准偏差(即粗糙度)。在这种情况下使用issparse没有帮助,因为我转换了accumarray使用repmat.

这段代码的重点是从点云估计一块土地的高度、粗糙度、颜色和强度。我将 X 和 Y 中的坐标四舍五入以创建一个网格,现在需要每个网格单元格的平均值,但输出为“表格”(不是 MATLAB 数据类型,而是一个不是默认矩阵输出的二维数组)。

所以,用这个问题来结束:

有没有一种方法accumarray或类似的函数可以在没有中间(可能非常大)矩阵的情况下输出此表?

下面的代码:

这里的第九列只是每个单元格的点数。

因此,对同一 X、Y(例如[19 36][21 37])上的所有点进行平均(按该顺序排列的高度、RGB、强度),并且对于第三列中的值,还需要标准偏差:

其余数据以此类推。

我将我的代码更新到我拥有的最新版本。这大大减少了内存开销,因为该函数现在一个接一个地创建网格,而不是一次创建所有网格。但是,代码是并行运行的,因此仍然会同时创建八个网格,因此仍然需要一个解决方案。

0 投票
1 回答
157 浏览

matlab - 使用 accumarray MATLAB 时改进代码/删除 for 循环

我有以下代码从数据集(“DATA”)计算百分位数非常慢,因为输入矩阵很大(“Data”大约长 500.000,从“Indices”分配了 10080 个唯一值) .

是否有可能/建议使这段代码更高效?例如,我可以以某种方式省略 for 循环吗?

0 投票
1 回答
736 浏览

arrays - 用于 3D 矩阵的 Matlab Accumarray

我真的希望文档更清楚地说明在 Matlab 中将 accumarray 用于 ND 大小矩阵。无论如何,我在这里完全感到困惑并寻求一些建议。这是挑战:

我有一个 3D 数据矩阵。

  • ROWS 是单独的河流
  • 列是观察日期
  • PAGES 是数据收集的时间间隔

对于此示例,我们假设每次观察都是 5 分钟间隔内流过仪表的水量。但是,我现在希望将数据重新采样到 N 分钟的间隔(显然是 5 的倍数)。让我们选择 NMINS = 15。

所以,我想做的是在 NMINS 分钟间隔内找到水量的总和或平均值。也就是说,ROWS 和 COLUMNS 不会改变,但 PAGES 的维度和值将被抽取/聚合。

我可以获得页面的分组值。也就是说,我需要分组的值。如果它是一天的一条河流,没问题。但是,我有数百天,数十条河流。

我已经做到了这一点:

创建测试时间向量

为测试创建随机矩阵

以分钟为单位查找时间

现在查找与我们的存储桶对应的所有时间

重置分组索引

补充: 小组规模将不一致,我不能做出这样的假设(很遗憾)。在运行上述内容后考虑以下内容。

输出显示第一组的大小为 1:

最后,最终,我需要传递自定义函数。以上是一个快速说明问题的玩具示例。我很抱歉没有更清楚。

结束添加

这就是我绊倒的地方......

如何设置 subs 值以应用于每个页面以使用 accumarray?我完全被文档弄糊涂了。或者这实际上是错误的方法?值得我使用的是 Matlab 2015b。

老实说,任何帮助将不胜感激。

替代解决方案 这在回家的路上击中了我。Meshgrid是我的朋友...

一旦上面的单元格运行(注意我改变了矩阵 X 的大小),我们为整个矩阵创建索引,其中页面的“索引”(即时间)由“subs”中的值给出。为此,我使用网格网格。

可能不是内存效率最高的,因为我必须创建天数、河流和页面矩阵,然后最终创建一个新的 grpvals 数组。但是,它的优点是现在我可以使用 accumarray 并传递匿名函数、@std 等。

希望这对其他人有帮助!

非常感谢路易斯。

0 投票
1 回答
395 浏览

arrays - 使用区间对向量中的元素求和

假设我有一个名为的向量vect = [1 2 3 4 5 6 7 8 9]和另一个名为 的向量intervals = [1 3 6 9]vest是否可以使用获得另一个元素的部分和的向量intervals?我想做这样的事情:

vect(1)部分和 1 = 1 + 2 + 3(从到 的元素vect(3)

vect(3 + 1)部分和 2 = 4 + 5 + 6(从到 的元素vect(6)

vect(6 + 1)部分和 3 = 7 + 8 + 9(从到 的元素vect(9)

所以我想做的是获得第一个k元素的总和,然后是k从第一个元素开始的另一个元素的总和,而不是前一个元素的总和等。

原始问题: 原始问题是这样的:我收到一个带有n值的向量和一个值k。让我们做t = max(v) / k间隔。n现在,区间 [0, t) 中有多少个值?[t, t * 2) 呢?那么[2 * t,3 * t)呢?等等。直到现在,我曾经accumarray(v, 1)找到每个我有多少个值并int = (0:max(v)/k:max(v))构建 invervals 向量,但现在我必须以sum(accumarray(v, 1))某种方式获得这些部分和。

如果你想测试,使用这个(http://pastebin.com/jCZ3qYhz:生成accumarray)并且k = 16,部分总和必须是:157、167、136、251、726、1300、1152 ..我想要能够在没有 for/while 循环的情况下做到这一点 :) 向量化是关键!

编辑: 为了得到我的第一个总和,我使用这个:sum(accumarray(v, 1)(1:16)),第二个:sum(accumarray(v, 1)(17:32)),但我不知道如何向量化这个操作。我试过这个:i = (1:16:500)。然后sum(accumarray(v, 1)(i(1:length(i)) : i(2:length(i))),但它并没有真正起作用,或者我没有使用正确的东西。

0 投票
0 回答
339 浏览

matlab - 每小时降雨数据的累积和计算 MATLAB

我有一个从 1970 年到 2003 年的每小时降雨时间序列。我想计算:

  1. n 小时值,n = 2、3、6、12、24 和 48 小时。24 小时降雨数据可以通过累积 24 个连续的 1 小时数据来计算。同样,可以通过添加 2 天的降雨量值来计算 48 小时的降雨量。

  2. 从 n-hr 时间序列中,我想计算每年的最大降雨量。

同样,我可以计算其他积累期。但是,我需要从 n 小时数据(聚合时间序列)计算年最大降雨量值的建议,该数据可以从每年 n 小时降雨量信息的最大值计算。例如,从 1970 年到 2003 年,我想提取对应于 2、...24 小时的 34 个年度最大值和 48 小时的 19 个年度最大值。请在此处找到示例数据集:

https://docs.google.com/document/d/1e8g54c6KDw8lwdQ53xi0Bs9fJmasTqbIk2n4LbKA-gM/edit

第一、二、三、四列分别表示年、月、日、值。

我试过这段代码:

我编辑了我的代码。现在的问题是:在矩阵 ny_p 中,早年的值也在运行时被存储。我想在矩阵 Ann_Max 中获取每年的最大 n 小时值数组。

0 投票
0 回答
153 浏览

multithreading - accumarray 的多线程替代方案

我正在使用从 xyz 坐标列表及其各自的值accumarray()创建一个 3D 数组,如下所示:PointCoorsPointValues

但是我发现accumarray()它不是多线程的(不明白为什么不应该这样做),因此这一步的计算需要很长时间。

accumarray()有没有可以利用多核的替代方案?

谢谢

0 投票
1 回答
187 浏览

matlab - Matlab的Accumarray使用稀疏矩阵乘法

我在matlab中有以下说明

其中 B 和 A 的大小分别为 1x957600 和 957600x1,sz 为 [1445 1]。结果是 1445x1 大小。

我的问题是我们如何在不使用 accumarray 和使用稀疏矩阵乘法的情况下实现此指令。

我找到了以下解决方案,但我不知道如何根据我拥有的数据来实现它

Matlab代码

我问这个问题是因为我想在 C++ 中使用 accumarray。我有一个解决方案,但它需要很多时间来进行计算。是我两天前的问题,其中包含 accumarray 的 c++ 实现。