标签: accumarray

是否有一个accumarray()将矩阵作为"val"?

accumarray()val论点必须是一个向量.在我的情况下,我需要矩阵的列被求和(或平均).是否有功能或方法来实现这一目标?

我现在正在做的是for循环我分别对列值进行求和:

for iCol = 1:nCols
    means(:,iCol) = accumarray(labels', X(:,iCol));
end
Run Code Online (Sandbox Code Playgroud)

matlab grouping matrix accumarray

12
推荐指数
1
解决办法
4137
查看次数

`accumarray`对其函数参数进行异常调用

精简版:

作为第四个参数传递的函数accumarray有时会被调用,其参数与编写第一个参数的规范不一致accumarray.

因此,用作参数的函数accumarray必须测试实际上是异常条件的内容.

问题是:如何对这种异常条件进行1表达式匿名函数测试?更一般地说:如何编写对accumarray未记录的行为具有鲁棒性的匿名函数?


完整版本:

下面的代码是我今天大部分工作日的问题的彻底提炼版本.

首先是一些定义:

idxs = [1:3 1:3 1:3]';

vals0 = [1   4 6   3 5 7   6 Inf 2]';
vals1 = [1 Inf 6   3 5 7   6   4 2]';

anon = @(x) max(x(~isinf(x)));
Run Code Online (Sandbox Code Playgroud)

注释vals1vals0通过交换元素2和8获得的."匿名"函数anon计算其输入的非无限元素中的最大值.

鉴于这些定义,下面两个调用

accumarray(idxs, vals0, [], anon)
accumarray(idxs, vals1, [], anon)
Run Code Online (Sandbox Code Playgroud)

其区别仅在于在其第二个参数(vals0VS vals1)时,应产生相同的结果,因为之间的差vals0vals1只影响在该参数的值与所述呼叫的一个排序anon,并且该函数的结果是不敏感的排序其论点中的元素.

事实证明,这两个表达式中的第一个正常评估并产生正确的结果1:

>> accumarray(idxs, vals0, …
Run Code Online (Sandbox Code Playgroud)

matlab accumarray

9
推荐指数
2
解决办法
322
查看次数

在累积的行值中进行平均计算,同时忽略MATLAB中的NaN

我正在寻找有关如何优雅地解决以下问题的建议.虽然在我的具体案例中表现不是问题,但我会对有关良好做法的评论表示赞赏.

提前致谢!

简短版本:

我试图根据一些逻辑平均矩阵行,而忽略NaN值.我目前的代码没有按照我想要的方式处理NaN值.

长版:

我的数据以下列方式构建:

  • 单个(第一)列"箱".每个bin的行数不是恒定的.垃圾箱不必是整数.行是预先排序的.
  • 可变数量的数据列,可能包括NaN.

这是一个例子:

DATA = [...
180     NaN     NaN     1.733
180     NaN     NaN     1.703
200     0.720   2.117   1.738
200     0.706   2.073   1.722
200     0.693   2.025   1.723
200     NaN     NaN     1.729
210     NaN     NaN     1.820
210     NaN     NaN     1.813
210     NaN     NaN     1.805
240     NaN     NaN     1.951
240     NaN     NaN     1.946
240     NaN     NaN     1.946
270     NaN     NaN     2.061
270     NaN     NaN     2.052
300     0.754   2.356   2.103
300     0.758   2.342   2.057
300     NaN …
Run Code Online (Sandbox Code Playgroud)

matlab nan accumarray

8
推荐指数
1
解决办法
1246
查看次数

针对numba优化对numpy数组的访问

我最近偶然发现了numba,并考虑用更优雅的autojitted python代码替换一些自制的C扩展.不幸的是,当我尝试第一个快速基准时,我并不高兴.看起来numba在这里并没有比普通的python好多少,虽然我本来期待几乎类似C的性能:

from numba import jit, autojit, uint, double
import numpy as np
import imp
import logging
logging.getLogger('numba.codegen.debug').setLevel(logging.INFO)

def sum_accum(accmap, a):
    res = np.zeros(np.max(accmap) + 1, dtype=a.dtype)
    for i in xrange(len(accmap)):
        res[accmap[i]] += a[i]
    return res

autonumba_sum_accum = autojit(sum_accum)
numba_sum_accum = jit(double[:](int_[:], double[:]), 
                      locals=dict(i=uint))(sum_accum)

accmap = np.repeat(np.arange(1000), 2)
np.random.shuffle(accmap)
accmap = np.repeat(accmap, 10)
a = np.random.randn(accmap.size)

ref = sum_accum(accmap, a)
assert np.all(ref == numba_sum_accum(accmap, a))
assert np.all(ref == autonumba_sum_accum(accmap, a))

%timeit sum_accum(accmap, a)
%timeit autonumba_sum_accum(accmap, a)
%timeit numba_sum_accum(accmap, …
Run Code Online (Sandbox Code Playgroud)

python jit numpy numba accumarray

7
推荐指数
2
解决办法
2835
查看次数

如何快速获得多重数组

什么是服用的阵列的最快方式A和outputing二者unique(A)[即所述一组唯一的数组元素A]以及多重阵列这需要在其第i个位置的第i个条目的第i个多重性unique(A)A.

这是一个满口,所以这是一个例子.鉴于A=[1 1 3 1 4 5 3],我想:

  1. unique(A)=[1 3 4 5]
  2. mult = [3 2 1 1]

这可以通过繁琐的for循环来完成,但是想知道是否有办法利用MATLAB的数组特性.

arrays matlab unique accumarray

7
推荐指数
1
解决办法
1026
查看次数

MATLAB Accumarray加权平均值

因此,我目前正在使用'accumarray'来查找与匹配ID相对应的一系列数字的平均值.输入输入:

ID----Value
1     215
1     336
1     123
2     111
2     246
2     851
Run Code Online (Sandbox Code Playgroud)

我当前的代码找到上述值的未加权平均值,使用ID作为'分隔符',这样我就不会将所有值的平均值作为一个数字一起得到,而是仅将具有相应ID的值的单独结果分开.EX输出:

ID----Value
1     224.66
2     402.66
Run Code Online (Sandbox Code Playgroud)

为此,我使用此代码:

[ID, ~, Groups] = unique(StarData2(:,1),'stable');
app = accumarray(Groups, StarData2(:,2), [], @mean);
Run Code Online (Sandbox Code Playgroud)

使用StarData2作为函数的输入.这对我的目的来说是完美的,直到现在,我需要知道是否可以使用accumarray给我一个加权平均值,这样app中的每个点(在找到平均值之前)都可以赋予权重或@mean可以被替换为可以实现此目的的功能.新输入将如下所示:

ID----Value----Weight
1     215     12
1     336     17
1     123     11
2     111     6
2     246     20
2     851     18
Run Code Online (Sandbox Code Playgroud)

新代码必须求和(val(i)*weight(i))/ sum(weight)而不仅仅是标准均值.谢谢你的帮助.

matlab average mean accumarray

6
推荐指数
1
解决办法
2663
查看次数

使用百分比函数与accumarray

我有两个数组:

OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65,...]
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2,...]
Run Code Online (Sandbox Code Playgroud)

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

OTPCORorder1 = [61,62,65,...]
AprefCOR1 = [1,0.72,0,...]
Run Code Online (Sandbox Code Playgroud)

我已经有了这个:

[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
ANS = OTPCORorder1 = [61,62,65,...];
Run Code Online (Sandbox Code Playgroud)

我曾经使用过"accumarray",但我使用了"mean"或"sum"这样的功能:

AprefCOR1 = accumarray(idx,AprefCOR,[],@mean).';
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否存在一种方法来使用它,但是使用"prctile"函数或任何其他函数给出了特定元素的百分比,例如在这种情况下为"1".

非常感谢你.

arrays matlab percentage accumarray

6
推荐指数
1
解决办法
84
查看次数

让accumarray输出一张表

accumarray 使用两行索引来创建一个矩阵,该矩阵在有效索引对的位置上具有由指定函数指定的值的元素,例如:

A = [11:20]; 
B = flipud([11:20]); 
C = 1:10;
datamatrix = accumarray([A B],C);
Run Code Online (Sandbox Code Playgroud)

这种方式datamatrix将是一个20x20带有值的矩阵.如果值A以及B但是都非常大,这将导致大部分是空的矩阵,在远角小批量的数据.为了避免这种情况,可以设置accumarrayissparse:

sparsedatamatrix = accumarray([A B],C,[],@sum,[],true);
Run Code Online (Sandbox Code Playgroud)

这将节省大量内存min(A)和/或min(B)非常大.

然而,我的问题是我有一个Mx7矩阵,M~1e8我希望根据前两列中的索引收集第三列到第七列的方法,以及基于第三列的第三列的标准偏差:

result = accumarray([data(:,1) data(:,2)],data(:,3),[],@std);
Run Code Online (Sandbox Code Playgroud)

我想保存此回一个表,构成为[X Y Z std R G B I],在这里XY是指数,Z是该像素的平均高度,R,G,BI是每个象素的平均值(颜色和强度)和std是高度的标准偏差(即粗糙度).使用issparse在这种情况下没有帮助,因为我改变我的矩阵日起,accumarray使用repmat.

该代码的要点是从点云估计一块土地的高度,粗糙度,颜色和强度.我舍入了X和Y中的坐标来创建一个网格,现在需要每个网格单元的平均值,但输出为"表"(不是MATLAB数据类型,而是一个不是默认矩阵输出的2D数组).

那么,总结一下这个问题: …

arrays matlab accumarray

6
推荐指数
1
解决办法
329
查看次数

在MATLAB中稳定准确

MATLAB的内置函数accumarray接受函数fun作为第四个参数.

A = accumarray(subs,val,sz,fun);
Run Code Online (Sandbox Code Playgroud)

这适用funval具有相同下标的元素的每个子集subs.但文件说明:

如果下标subs未按其线性索引排序,则fun不应取决于其输入数据中值的顺序.

我们如何实现一个没有这个限制的稳定版本accumarray,但是会保证子集采用与给定的相同的顺序val

例:

subs = [1:10,1:10];
val = 1:20;
accumarray(subs(:), val(:), [], @(x)x(end)).'
Run Code Online (Sandbox Code Playgroud)

这样做的预计产出将是11:20,如果accumarray是稳定的.实际上输出是:

ans =
    11    12    13    14     5     6     7    18    19    20
Run Code Online (Sandbox Code Playgroud)

我们的实施应该产生:

accumarrayStable(subs(:), val(:), [], @(x)x(end)).'`
ans =
    11    12    13    14    15    16    17    18    19    20
Run Code Online (Sandbox Code Playgroud)

matlab stable-sort accumarray

5
推荐指数
1
解决办法
430
查看次数

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

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

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

k = 1;
for i = 0:0.5:100; % in 0.5 fractile-steps
     FRACTILE(:,k) = accumarray(Indices,Data,[], @(x) prctile(x,i));
     k = k+1;
end
Run Code Online (Sandbox Code Playgroud)

matlab vectorization percentile accumarray

3
推荐指数
1
解决办法
121
查看次数

MatLab AccumArray 意外改变顺序

只要我理解accumarray,它的意思是“制作输出的第n行:1)在sub中找到n。2)如果n在sub中的m1,m2,m3个元素中,3)将函数应用于m1,m2 ,m3 val 4) 的第一个元素,这是输出的第 n 行”

我有什么地方说错了吗?

我运行了以下代码。

A = [2 10 13 ; 1 11 14; 1 12 10]
[U,ix,iu]= unique(A(:,1))
vals = reshape(A(:, 2:end).', [], 1)
subs = reshape(iu(:, ones(size(A, 2)-1,1)).', [], 1)
r2 = accumarray(subs, vals', [], @(x){x'})
r2{1}
r2{2}
Run Code Online (Sandbox Code Playgroud)

A=

 2    10    13
 1    11    14
 1    12    10
Run Code Online (Sandbox Code Playgroud)

U=

 1
 2
Run Code Online (Sandbox Code Playgroud)

九 =

 3
 1
Run Code Online (Sandbox Code Playgroud)

国际单位 =

 2
 1
 1
Run Code Online (Sandbox Code Playgroud)

值=

10
13
11
14
12
10
Run Code Online (Sandbox Code Playgroud)

替补=

 2
 2
 1
 1
 1
 1 …
Run Code Online (Sandbox Code Playgroud)

matlab grouping accumulate accumarray

2
推荐指数
1
解决办法
349
查看次数

使用accumarray在Matlab中对数据求和

我有一个像这样的矩阵:

>>D=[1,0,10;3,1,12;3,1,12.5;6,1,6;6,2,11.1;]
D =

1.0000         0   10.0000
3.0000    1.0000   12.0000
3.0000    1.0000   12.5000
6.0000    1.0000    6.0000
6.0000    2.0000   11.1000
Run Code Online (Sandbox Code Playgroud)

如果第一列的数据相同,我想得到第二列数据的总和.例如,我想要:

E=
1.0000         0
3.0000    2.0000
6.0000    3.0000
Run Code Online (Sandbox Code Playgroud)

所以我试过了

b = accumarray(D(:,1),D(:,2),[],[],[],true);
[i,~,v] = find(b);
E = [i,v]
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我该怎么办?

matlab matrix accumarray

2
推荐指数
1
解决办法
326
查看次数