计算多条曲线的平均值

时间:2017-05-31 14:16:48

标签: matlab

我有一个矩阵203559x2,它对应于电池放电曲线的数据。知道每个电荷有大约3622个点(但它不是固定值),最后我有56条曲线。我想平均每10条曲线,之后我想重载那些平均曲线来比较它们的evolutoin。

我尝试做的是重新整形数据,以便将每条放电曲线放在一列中,而不是制作列的平均值。

这是我所做的一个例子:

M是矩阵203559x2

X= reshape(M(:,1),[], 56);
Y= reshape(M(:,2),[], 56);

n=10;
for i =1:size(M,2)
    X10=mean(X(:,(1+n:2*n),2, 'omitnan');
    Y10=mean(Y(:,(1+n:n+n),2, 'omitnan');
    n=n+n
end

但我错过了一些东西。 我有另一个表M_indx是一个矩阵56x2,其中我有每条曲线的数据的起始行和结束行,但我不知道如何使用它来编写这个脚本。

欢迎任何帮助

2 个答案:

答案 0 :(得分:2)

你有几个错误,所以我不确定是哪一个导致了这个问题:

  1. 203559行M不能被56列整除。 reshape不会为您创建新值,因此M必须恰好是56的倍数。另外,如果我们取最接近的值203560 是56的倍数我们写了3635行而不是3622行。您最好再次检查您的数据,以确定您没有遗漏任何内容。
  2. for循环会在每个循环中覆盖X10Y10。为了保存所有迭代的均值,您必须使用循环的迭代器 - i来索引输出变量X10Y10
  3. 在每次调用)函数时,您都会错过结束mean
  4. 在循环结束时,您编写n = n+n,在下一次迭代中将列数加倍,取得平均值,而您写的时候想要分批获取它们。
  5. 不确定您是否想要它 - 但是从第11列开始,而不是1(从10开始n,而不是0)。
  6. 以下是您的代码的固定版本:

    X = reshape(M(:,1),[], 56);
    Y = reshape(M(:,2),[], 56);
    X10 = zeros(size(X,1),6);
    Y10 = zeros(size(X,1),6);
    n = 10;
    for k = 1:n:size(X,2)
        c = (k+9)/n; % column for output
        X10(:,c) = mean(X(:,k:min(k+n-1,size(X,2))),2, 'omitnan');
        Y10(:,c) = mean(Y(:,k:min(k+n-1,size(X,2))),2, 'omitnan');
    end
    

    每次取10列的平均值,并将其放在X10Y10中的一列中。因此X10(:,1)X(:,1:10)的平均值,X10(:,2)X(:,11:20)的平均值,依此类推,Y10也是如此。

    这仍然无法解决上面的问题1,你必须弄清楚你的数据。

答案 1 :(得分:1)

问题

重塑不会像你所说的那样有效:

  

“每笔费用 3622分”(强调我的)

使用重塑只对每条曲线的均匀点数有效。

解决方案

重塑过程可以通过写入较大矩阵的列并使用nan填充空条目(基本上为每列添加nan值以使它们具有相同的长度)来近似。

sz = max(diff(M_indX,[],2))+1; % find max num of points across all curves
X=nan(sz,size(M_indX,1));
Y=nan(sz,size(M_indX,1));
for ii = 1:size(M_indX,1)
  iXs = M_indX(ii,1); % current curve ind X start
  iXe = M_indX(ii,2); % current curve ind X end
  X( 1:(iXe-iXs+1) ,ii) = M(iXs:iXe,1); 
  Y( 1:(iXe-iXs+1) ,ii) = M(iXs:iXe,2);
end

此代码创建XY矩阵,其中nan通过循环遍历每条曲线并将其数据写入每列来填充它们,将nan值留在那里当前曲线的数据点数少于sz,即点数最多的曲线点数。

由于使用mean标记,此解决方法与'omitnan'兼容。

EBH的答案中解决了代码中的其他问题