2013-02-03 101 views
1

在MATLAB中,我有一個80000 * 20數字的矩陣。我想計算第1列(0-100)的前100個數字,第1列的下一個(第二個)100個數字(101-200),第1列的第100個數字(201)的平均值,最大值和最小值-300)等。對於所有列都是相似的。我想我需要一個循環來分離矩陣,因爲矩陣的大分解。我怎樣才能做到這一點?如何在MATLAB中每隔100個數字分隔每列矩陣

因此,例如: 矩陣:

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

然後我想平均,minumun和A1 B1 C1的最大值和平均值,D1 E1 F1的最小值和最大值。 Simular列2(A2 B2 C2)和(D2 E2 F2),3,4,5,6..etc

問候,

文森特

+0

歡迎來到Stack Overflow。僅供將來參考,通常會在發佈問題時發佈一些代碼,說明您已嘗試過什麼。如果你能記住未來將非常感激。乾杯。 –

+0

ps如果您覺得我的迴應可以解決您的問題,請點擊旁邊的勾號標記回答的問題。 –

回答

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函數的解決方案。 maxmin的情況隨着這些函數的替換而平凡地進行。

+0

這非常有用,感謝您的幫助! – user2037922

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 

但是,對於足夠大的數據集,將數據複製到臨時變量效率不高,並且基於循環的解決方案效果更好。

+0

一個不錯的選擇,+1。 –

+0

這非常有用,感謝您的幫助!但事實上,在大型矩陣的情況下,基於循環的解決方案可能會更好。 – user2037922

相關問題