Matlab 列中不同值的平均数

Matlab 列中不同值的平均数,matlab,average,Matlab,Average,我在Matlab中遇到了一个问题。就是这样,我试着取不同数值的平均值​​在一列中。例如,如果我们有下面的列 X = [1 1 2 3 4 3 8 2 1 3 5 6 7 7 5] 首先,我想从取5个值的平均值开始​​并策划它们。在上面的例子中,我应该得到三个我可以绘制的平均值。然后取10个值​​每次等等。 我想知道您是否必须编写自定义代码来修复它。如果您发布一些代码并准确指出哪些不起作用,这将非常有用 作为第一个指针。如果 X = [1 1 2 3 4 3 8 2 1 3 5 6 7 7 5]

我在Matlab中遇到了一个问题。就是这样,我试着取不同数值的平均值​​在一列中。例如,如果我们有下面的列

X = [1 1 2 3 4 3 8 2 1 3 5 6 7 7 5]
首先,我想从取5个值的平均值开始​​并策划它们。在上面的例子中,我应该得到三个我可以绘制的平均值。然后取10个值​​每次等等。
我想知道您是否必须编写自定义代码来修复它。

如果您发布一些代码并准确指出哪些不起作用,这将非常有用

作为第一个指针。如果

X = [1 1 2 3 4 3 8 2 1 3 5 6 7 7 5]
你感兴趣的5块中的三种方法是

mean(X(1:5))
mean(X(6:10))
mean(X(11:15))

你必须想出一个for循环,或者其他方法来迭代索引。

如果你发布了一些代码,并准确指出哪些不起作用,这将是很有帮助的

作为第一个指针。如果

X = [1 1 2 3 4 3 8 2 1 3 5 6 7 7 5]
你感兴趣的5块中的三种方法是

mean(X(1:5))
mean(X(6:10))
mean(X(11:15))

你必须想出一个for循环,或者其他方法来迭代索引。

这应该可以做到:

对于选定的
N
(要取平均值的值的数目):

注意:这不检查索引是否超过矩阵维度

如果要跳过最后的数字,这应该可以:

mean_vals = arrayfun(@(n) mean(X(n-1+(1:N))),1:N:(length(X)-mod(length(X),N)));
要添加其余值,请执行以下操作:

if mod(length(X),N) ~= 0
   mean_vals(end+1) = mean(X(numel(X)+1-mod(length(X),N):end))
end
更新:这是对第一个答案(编辑前)的修改。它使用
nanmean()。因此,不要用
0
填充其余行,而是用
NaN
填充它们,然后取平均值

X = [X(:); NaN(mod(N - numel(X), N), 1)];
X_avg = nanmean(reshape(X, N, []));

这应该可以做到:

对于选定的
N
(要取平均值的值的数目):

注意:这不检查索引是否超过矩阵维度

如果要跳过最后的数字,这应该可以:

mean_vals = arrayfun(@(n) mean(X(n-1+(1:N))),1:N:(length(X)-mod(length(X),N)));
要添加其余值,请执行以下操作:

if mod(length(X),N) ~= 0
   mean_vals(end+1) = mean(X(numel(X)+1-mod(length(X),N):end))
end
更新:这是对第一个答案(编辑前)的修改。它使用
nanmean()。因此,不要用
0
填充其余行,而是用
NaN
填充它们,然后取平均值

X = [X(:); NaN(mod(N - numel(X), N), 1)];
X_avg = nanmean(reshape(X, N, []));

我想你想要这样的东西(我有一段时间没有使用Matlab了,我希望语法是正确的):

X=[1 2 3 4 3 8 2 1 3 5 6 7 5],
当前金额=5,
块=0,

while(numel(X)我想你想要这样的东西(我有一段时间没有使用Matlab了,我希望语法是正确的):

X=[1 2 3 4 3 8 2 1 3 5 6 7 5],
当前金额=5,
块=0,

而(numel(X)最快的方法可能是将初始向量
X
重新排列到某个矩阵中,每列存储所需的平均值:

A = reshape(X, N, []);
其中,
N
是新矩阵中所需的行数,空括号(
[]
)告诉MATLAB自动计算列数。然后可以使用以下公式对每列进行平均:

Vector
X_avg
存储结果。这可以在一行中完成,如下所示:

X_avg = mean(reshape(X, N, []));
请注意,
X
中的元素数必须可以被
N
整除,否则您必须先填充它(例如用零),或者单独处理“剩余”的尾部元素:

tail = mod(numel(X), N);
X_avg = mean(reshape(X(1:numel(X) - tail), N, [])); %// Compute average values
X_avg(end + 1) = mean(X(end - tail + 1:end));       %// Handle leftover elements
function m = meanOfN(x, N)
% function m = meanOfN(x, N)
% create groups of N elements of vector x
% and return their mean
% if numel(x) is not a multiple of N, the last value returned
% will be for fewer than N elements
Nf = N * floor( numel( x ) / N ); % largest multiple of N <= length of x
xr = reshape( x( 1:Nf ), N, []);
m = mean(xr);
if Nf < N
  m = [m mean( x( Nf + 1:end ) )];
end
稍后,您可以将此代码放入循环中,计算并绘制每个迭代中不同
N
值的平均值

示例#1 结果是:

X_avg =
    2.2000   3.4000   6.0000
X_avg =
    2.8000   6.0000
示例2 下面是另一个例子(这次
X
的长度不能被
N
整除):

结果是:

X_avg =
    2.2000   3.4000   6.0000
X_avg =
    2.8000   6.0000

最快的方法可能是将初始向量
X
重新排列到某个矩阵中,每列存储所需的平均值:

A = reshape(X, N, []);
其中,
N
是新矩阵中所需的行数,空括号(
[]
)告诉MATLAB自动计算列数。然后可以使用以下公式对每列进行平均:

Vector
X_avg
存储结果。这可以在一行中完成,如下所示:

X_avg = mean(reshape(X, N, []));
请注意,
X
中的元素数必须可以被
N
整除,否则您必须先填充它(例如用零),或者单独处理“剩余”的尾部元素:

tail = mod(numel(X), N);
X_avg = mean(reshape(X(1:numel(X) - tail), N, [])); %// Compute average values
X_avg(end + 1) = mean(X(end - tail + 1:end));       %// Handle leftover elements
function m = meanOfN(x, N)
% function m = meanOfN(x, N)
% create groups of N elements of vector x
% and return their mean
% if numel(x) is not a multiple of N, the last value returned
% will be for fewer than N elements
Nf = N * floor( numel( x ) / N ); % largest multiple of N <= length of x
xr = reshape( x( 1:Nf ), N, []);
m = mean(xr);
if Nf < N
  m = [m mean( x( Nf + 1:end ) )];
end
稍后,您可以将此代码放入循环中,计算并绘制每个迭代中不同
N
值的平均值

示例#1 结果是:

X_avg =
    2.2000   3.4000   6.0000
X_avg =
    2.8000   6.0000
示例2 下面是另一个例子(这次
X
的长度不能被
N
整除):

结果是:

X_avg =
    2.2000   3.4000   6.0000
X_avg =
    2.8000   6.0000

如果您需要经常执行此操作,可能值得为其编写自己的函数。我建议使用@EitanT的基本思想:填充数据,重塑形状,取每列的平均值。但是,与其在末尾包含零填充数字,我建议分别取“零散”数据点的平均值:

tail = mod(numel(X), N);
X_avg = mean(reshape(X(1:numel(X) - tail), N, [])); %// Compute average values
X_avg(end + 1) = mean(X(end - tail + 1:end));       %// Handle leftover elements
function m = meanOfN(x, N)
% function m = meanOfN(x, N)
% create groups of N elements of vector x
% and return their mean
% if numel(x) is not a multiple of N, the last value returned
% will be for fewer than N elements
Nf = N * floor( numel( x ) / N ); % largest multiple of N <= length of x
xr = reshape( x( 1:Nf ), N, []);
m = mean(xr);
if Nf < N
  m = [m mean( x( Nf + 1:end ) )];
end
这可以通过简单地将数据与一个向量进行卷积来实现;为了完整性,这里有一种可能的编码方式:

function m = meansOfN(x, n)
% function m = meansOfN(x, n)
% taking the running mean of the values in x
% over n samples. Returns a row vector of size (sizeof(x) - n + 1)
% if numel(x) < n, this returns an empty matrix
mv = ones(N,1) / N; % vector of ones, normalized
m = convn(x(:), mv, 'valid'); % perform 1D convolution

Matlab将找到函数,执行计算,返回结果。为这样的特定操作编写自定义函数非常有用-它不仅可以保持代码整洁,而且只需测试函数一次…

如果您需要经常执行此操作,可能值得为其编写自己的函数我建议使用@EitanT的基本思想:填充数据,重塑形状,取每列的平均值。但是,与其在末尾包含零填充数字,我建议分别取“离散”数据点的平均值:

tail = mod(numel(X), N);
X_avg = mean(reshape(X(1:numel(X) - tail), N, [])); %// Compute average values
X_avg(end + 1) = mean(X(end - tail + 1:end));       %// Handle leftover elements
function m = meanOfN(x, N)
% function m = meanOfN(x, N)
% create groups of N elements of vector x
% and return their mean
% if numel(x) is not a multiple of N, the last value returned
% will be for fewer than N elements
Nf = N * floor( numel( x ) / N ); % largest multiple of N <= length of x
xr = reshape( x( 1:Nf ), N, []);
m = mean(xr);
if Nf < N
  m = [m mean( x( Nf + 1:end ) )];
end
这可以通过简单地将数据与一个向量进行卷积来实现;为了完整性,这里有一种可能的编码方式:

function m = meansOfN(x, n)
% function m = meansOfN(x, n)
% taking the running mean of the values in x
% over n samples. Returns a row vector of size (sizeof(x) - n + 1)
% if numel(x) < n, this returns an empty matrix
mv = ones(N,1) / N; % vector of ones, normalized
m = convn(x(:), mv, 'valid'); % perform 1D convolution
Matlab将查找函数,执行计算,返回结果。Wri