1

MATLAB には、80000*20 の数値の行列があります。列 1 の最初の 100 個の数値 (0-100)、列 1 の次 (2 番目) の 100 個の数値 (101-200)、列 1 の 3 番目の 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

以下は、考えられる 2 つの解決策の例です。1 つはループを使用します。もう 1 つは行列を cell 配列に変換し、 を使用して cell 配列に対して演算を実行し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上記の例の関数の解決策を実行しました。maxandの場合はmin、これらの関数の置換に自明に続きます。

于 2013-02-03T22:02:46.963 に答える