我有一个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
答案 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}}坐标,0
以10
为步长,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
轴创建等效值,最后绘制所有内容。