matlab中有用的两个函数unique和accumarray

 对矢量化编程非常有用,在大规模数据处理(有限元、时间序列)中避免for循环。

%

[unique_ids, ~, group_idx] = unique(datPrice.Var3);

avg_values = accumarray(group_idx, datPrice.Var2, [], @mean);

%

Pdata = [unique_ids, avg_values];

[uniqueTimesS, ~, idxS] = unique(Sdata(:,1));

summedQuantitiesS = accumarray(idxS, Sdata(:,2).*Sdata(:,3));

resultS = [uniqueTimesS, summedQuantitiesS];

pS=[resultS(:,1), resultS(:,2)];

说明

示例

C = unique(A) 返回与 A 中相同的数据,但是不包含重复项。C 已排序。

  • 如果 A 是表或时间表,则 unique 按排序顺序返回 A 中的唯一行。对于时间表,当确定行是否唯一时,unique 会考虑行时间和行值,并按行时间对输出时间表 C 排序。

  • 如果 A 是分类数组,则排序顺序由类别的顺序确定。

示例

C = unique(A,setOrder) 以特定顺序返回 A 的唯一值。setOrder 可以是 'sorted'(默认值)或 'stable'。

C = unique(A,occurrence) 指定遇到重复值时应返回哪个索引。occurrence 可以是 'first'(默认值)或 'last'。

示例

C = unique(A,___,'rows') 和 C = unique(A,'rows',___) 将 A 中的每一行视为单个实体,并按排序顺序返回 A 中的唯一行。必须指定 A,而 setOrder 和 occurrence 是可选的。

'rows' 选项不支持元胞数组。

[C,ia,ic] = unique(___) 支持任何上述语法,且可返回索引向量 ia 和 ic。

  • 如果 A 是向量,则 C = A(ia) 且 A = C(ic)。

  • 如果 A 是矩阵或数组,则 C = A(ia) 且 A(:) = C(ic)。

  • 如果指定了 'rows' 选项,则 C = A(ia,:) 且 A = C(ic,:)。

  • 如果 A 是表或时间表,则 C = A(ia,:) 且 A = C(ic,:)。

说明

示例

B = accumarray(ind,data) 根据 ind 中指定的组,通过对向量 data 的元素进行累加来对组数据求和。然后计算每组的总和。ind 中的值定义数据所属的组以及存储每个组总和的输出数组 B 的索引。

要按顺序返回组总和,请将 ind 指定为向量。然后,对于索引为 i 的组,accumarray 返回其在 B(i) 中的总和。例如,如果 ind = [1 1 2 2]'和 data = [1 2 3 4]',则 B = accumarray(ind,data) 返回列向量 B = [3 7]'。

要以另一种形状返回组总和,请将 ind 指定为矩阵。对于 m×n 矩阵 ind,其中每一行的值表示指定的组和输出 B 的 n 维索引。例如,如果 ind 包含 [3 4] 形式的两行,则 data 中对应元素的总和存储在 B 的 (3,4) 元素中。

B 中未在 ind 中显示其索引的元素默认用 0 填充。

示例

B = accumarray(ind,data,sz) 返回填充到 sz 大小的数组 B。将 sz 指定为正整数向量,该向量等于或大于 ind 中的维度长度。输出中的额外元素用 0 填充。将 sz 指定为 [],让 ind 中的索引确定输出的大小。

示例

B = accumarray(ind,data,sz,fun) 将函数 fun 应用于由 ind 指定的 data 中的每个组。使用 @ 符号指定 fun,如 @mean,或指定为 [] 以使用默认值 @sum。

示例

B = accumarray(ind,data,sz,fun,fillval) 使用标量值 fillval 填充未被 ind 中的任何索引引用的 B 的所有元素。将 fillval 指定为 []以使用默认值 0。

示例

B = accumarray(ind,data,sz,fun,fillval,issparse) 返回数组 B,当 issparse 是 true 或 1 时,该数组是稀疏数组;如果 issparse是 false 或 0,则该数组为满数组。默认情况下,输出 B 为完全数组。

data = (1:6)'ind = [1 3 4 2 4 1]';B = accumarray(ind,data);B = 4×1      7      4      2      8

评论

此博客中的热门博文

新建的博客站点

Next-Gen Joint Optimization Engine for LORA & Spari

用大模型写程序