我有一个矩阵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
,其中我有每条曲线的数据的起始行和结束行,但我不知道如何使用它来编写这个脚本。
欢迎任何帮助
答案 0 :(得分:2)
你有几个错误,所以我不确定是哪一个导致了这个问题:
M
不能被56列整除。 reshape
不会为您创建新值,因此M
必须恰好是56的倍数。另外,如果我们取最接近的值203560 是56的倍数我们写了3635行而不是3622行。您最好再次检查您的数据,以确定您没有遗漏任何内容。for
循环会在每个循环中覆盖X10
和Y10
。为了保存所有迭代的均值,您必须使用循环的迭代器 - i
来索引输出变量X10
和Y10
。)
函数时,您都会错过结束mean
。n = n+n
,在下一次迭代中将列数加倍,取得平均值,而您写的时候想要分批获取它们。n
,而不是0)。以下是您的代码的固定版本:
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列的平均值,并将其放在X10
和Y10
中的一列中。因此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
此代码创建X
和Y
矩阵,其中nan
通过循环遍历每条曲线并将其数据写入每列来填充它们,将nan
值留在那里当前曲线的数据点数少于sz
,即点数最多的曲线点数。
由于使用mean
标记,此解决方法与'omitnan'
兼容。
EBH的答案中解决了代码中的其他问题