1

在 MATLAB 中,我有一个包含 80000*20 个数字的矩阵。我想计算第 1 列中的前 100 个数字(0-100)、第 1 列中的下一个(第二个)100 个数字(101-200)、第 1 列中的第三个 100 个数字(201)的平均值、最大值和最小值-300) 等。对所有列都相同。我想我需要一个循环来分离矩阵,因为矩阵的大尺寸。我怎样才能做到这一点?

例如:矩阵:

A1 A2 A3 A4 A5

B1 B2 B3 B4 B5

C1 C2 C3 C4 C5

D1 D2 D3 D4 D5

E1 E2 E3 E4 E5

F1 F2 F3 F4 F5

然后我想要 A1 B1 C1 的平均值、最小值和最大值以及 D1 E1 F1 的平均值、最小值和最大值。第 2 列 (A2 B2 C2) 和 (D2 E2 F2),3,4,5,6..等类似

问候,

文森特

4

2 回答 2

1

这是另一种不使用单元的无循环解决方案。

% M is the 80000x20 matrix
rows_per_dataset = 100;
rows_in_solution = size(M,1)/rows_per_dataset;

% flatten out the matrix so each column is one dataset
M_grouped = reshape(M,rows_per_dataset,rows_in_solution*size(M,2));
means = mean(M_grouped);
means = reshape(means,rows_in_solution,size(M,2));
% the value in each row and column is the mean of the corresponding dataset
% in the original data

然而,对于足够大的数据集,将数据复制到临时变量是低效的,基于循环的解决方案更好。

于 2013-02-04T00:31:11.560 回答
1

这是两种可能的解决方案的示例。一个使用循环。另一个将您的矩阵转换为元胞数组,使用 对元胞数组执行操作cellfun,然后将答案转换回矩阵。

%# Build random matrix X
T = 12;
N = 3;
X = randi(100, T, N);

%# Set the number of elements in each mean, min, and max calculation
K = 4;

%# Determine the number of groups
L = T / K;
if mod(L, 1) ~= 0; error('Number of rows not integer divisible by number of elements per group'); end

%# Loop based solution
Soln1 = nan(L, N);
for k = 1:K-1
    Soln1(k, :) = mean(X(k * K - K + 1:k * K, :));
end

%# Loop-less solution
CellOfMat = mat2cell(X, K * ones(L, 1), N);
Soln2 = cellfun(@mean, CellOfMat, 'UniformOutput', 0);
Soln2 = cell2mat(Soln2);

我已经完成了mean上面示例中的函数的解决方案。替换这些函数后,max和的情况就很简单了。min

于 2013-02-03T22:02:46.963 回答