matlab - 如何从现有矩阵中提取新矩阵

标签 matlab matrix

我将大量条目排列成三列。数据样本是:

A=[1 3 2 3 5 4 1 5 ; 
   22 25 27 20 22 21 23 27; 
   17 15 15 17 12 19 11 18]'

我想要第一列(小时)来控制整个矩阵来创建新的矩阵如下:

Anew=[1 2 3 4 5 ; 22.5 27 22.5 21 24.5; 14 15 16 19 15]'

Anew 的第 2 列是每个对应小时的平均值例如:

来自矩阵 A: 在第 1 小时,我们在第 2 列中有 2 个值对应于第 1 小时 分别是 22 和 23,所以平均值是 22.5

还有第 3 列:在第 1 小时,我们有 17 和 11,还有 平均值是 14,这一直持续到我使用 Matlab 的第 5 小时

最佳答案

您可以使用 ACCUMARRAY为此:

Anew = [unique(A(:,1)),...
        cell2mat(accumarray(A(:,1),1:size(A,1),[],@(x){mean(A(x,2:3),2)}))]

这使用第一列 A(:,1) 作为索引 (x) 选择第 2 列和第 3 列中的值进行平均 (mean( A(x,2:3),1)).花括号和对 cell2mat 的调用允许您同时处理两列。否则,您可以像这样单独处理每一列

Anew = [unique(A(:,1)), ...
        accumarray(A(:,1),A(:,2),[],@mean), ...
        accumarray(A(:,1),A(:,3),[],@mean)]

这实际上可能更具可读性。

编辑

以上假设任何时间都没有遗漏的条目。否则会导致错误。因此,计算 Anew 的更可靠方法是允许缺失值。为了便于识别缺失值,我们使用 accumarrayfillval 输入参数并将其设置为 NaN

Anew = [(1:max(A(:,1)))', ...
        accumarray(A(:,1),A(:,2),[],@mean,NaN), ...
        accumarray(A(:,1),A(:,3),[],@mean,NaN)]

关于matlab - 如何从现有矩阵中提取新矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187207/

相关文章:

matlab - Matlab优化工具箱中的非线性等式和不等式约束

matlab - 3d 灰度体积投影到 2D 平面上

matlab - Matlab/Octave 是否支持对矩阵切片的操作?

r - 用 NA 填充两个矩阵的缺失数据

java - 从随机矩阵中的一个点查找相同元素的算法

matlab - 在 matlab 中绘制立方根

matlab - SVM - 适用于/不适用于大范围的数字?

algorithm - 用于读取图像中文本的最佳 Python/Ruby 库

python - 乘以特定维度矩阵

java - OjAlgo : Is there a way to add/subtract a double from all elements of a PrimitiveDenseStore in ojAlgo?