插值后的平均矩阵值

时间:2017-07-19 14:36:23

标签: matlab matrix

我有一个1x24的矩阵。在每个单元格内是另一个单列的矩阵。但是,列长度从一个矩阵变为另一个矩阵。有没有办法平均每个矩阵的第一行,并输出到一个新的矩阵,其中第一个单元格是所有矩阵第一个单元格的平均值?然后第二个和第三个一直到最后?

到目前为止,这是我的脚本。你可以看到我创建了一个矩阵。现在我想平均它们(在我插入它们之后)。

hdfs

如果我点击yi变量,我会看到一行。在每个单元格中,还有另一个矩阵。第一个矩阵是10014x1,第二个矩阵是10084x1。我只关心前10,001个元素,尽管矩阵的长度不同。我只想从每个矩阵平均前10,000个元素。因此,行1从每个矩阵等平均,第2行,等等,都在10001x1的单个矩阵中

编辑:代码使用rayreng

close all
clear
clc

k = cell(1,24);
for k=1:24
   data{k} = xlsread('C:\data.xlsx',['PKA', num2str(k)]);
end


for i=1:24
xfinal{i}=data{1,i}(end,1);
xi{i}=0:0.001:xfinal{i};
xi{i}=transpose(xi{i});

x{i}=data{1,i}(:,1);
y{i}=data{1,i}(:,4);

yi{i} = interp1(x{i},y{i},xi{i});

xf{i}=xi{i};
xf{i}=(1:10001);

yi{i} = interp1(x{i},y{i},xi{i});

yf{i}=yi{i};
yf{i}=(1:10001);
end

1 个答案:

答案 0 :(得分:2)

不幸的是,因为你有一个数据的单元格数组,其中每个单元格具有不同的行长度,你别无选择,只能遍历每个单元格。更复杂的是,您希望找到要存储在输出数组中的所有单元格数组的每个位置i的平均值,以使Y(i)包含所需的平均值。天真的,你必须使用双for循环,但我可以推荐,因为你保证有10001个元素,并且在内存中相对便宜,只需使用一个for循环并创建一个长度为10001个元素的新矩阵,列总数为单元格总数。然后,您将提取单元格数组中每列的前10001个元素,并将其放在输出矩阵中的相应列中。一旦你这样做,只需在每一行中分别平均:

Y = zeros(10001, numel(data));
for ii = 1 : numel(data)
    Y(:, ii) = yi{ii}(1 : 10001);
end

Ymean = mean(Y, 2);

Y将包含大小为10001 x 24的矩阵,因此我们会逐行调用mean并将Y转换为10001 x 1列向量存储存储在i中的所有单元格数组的每个位置Ymean的平均值。

最后,您希望绘制一个误差条形图,您希望计算矩阵Y的每列的标准偏差。因此,您需要找到每行的标准偏差,然后将其与[errorbar](http://www.mathworks.com/help/matlab/ref/errorbar.html)函数一起使用。具体而言,根据您x的{​​{1}}坐标,010为步长,0.001坐标为每行的平均值对于y,误差条将是Y每行的标准偏差,因此绘制的误差条将是以每个平均点为中心的标准偏差的两倍。

因此:

Y

这个数字会相当聚集,因为你有10000点需要处理。相反,尝试二次取样并可能显示101点,以便了解您的可视化效果:

Y = zeros(10001, numel(data));
for ii = 1 : numel(data)
    Y(:, ii) = yi{ii}(1 : 10001);
end

Ymean = mean(Y, 2);
Ystd = std(Y, [], 2);

errorbar(0 : 0.001 : 10, Ymean, Ystd);

通常,您可以为每个点之间的所需间距设置变量,然后对errorbar(0 : 0.1 : 10, Ymean(1 : 100 : 10001), Ystd(1 : 100 : 10001)); x轴进行子采样,以及每个误差条的长度以完成所有操作

y

第一行代码定义了采样间隔,然后我们定义了从1到10001的向量,线性增加sampling_interval = 200; pts = 1 : sampling_interval : 10001; x = 0 : 0.001 : 10; x = x(pts); errorbar(x, Ymean(pts), Ystd(pts)); 量。然后,我们为sampling_interval轴创建等效值,最后绘制所有内容。