2013-07-05 3 views
3

У меня есть набор значений (например, 20 значений) в массиве.Извлечение подвектора вектора

A = [1:20] 

Я хочу разделить его на подмножества известного размера. Если я хочу, чтобы разделить его на 4 наборов размера 5, то я могу использовать

y = reshape(A,5,4)' 

Но моя проблема в том, когда я не имею соответствующие кратные размеры. Скажем, я хочу разделить массив на множества 3. Таким образом, будет 7 наборов, но последний набор будет коротким.

, что именно я хочу

a1= [1 2 3] 

a2= [4 5 6] 

a3= [7 8 9] 

a4= [10 11 12] 

a5= [13 14 15] 

a6= [16 17 18] 

a7= [19 20] 

Как я могу сделать этот вид к подгруппой вектора в MATLAB?

ответ

3

Вы можете использовать

y = mat2cell(A,1, diff([0:n:numel(A)-1 numel(A)])); 

Тогда a1=y{1} и так далее.

+0

+1 Хорошее использование функций Matlab, обеспечивающих эту функциональность. Чтобы быть ясным, 'n' является максимальным размером подмножества. Итак, для вашего примера, 'n = 3' дало бы' y {7} 'быть' [19 20] ' –

1

Для этого вам необходимо написать свою собственную функцию. Например:

A = 1:20; 
n = length(A); 
x = 3; 
y = ceil(n/x); 
out = cell(y,1); 
for i = 1:y 
    startIdx = x*(i-1)+1; 
    endIdx = min(startIdx + x - 1,n); 
    out{i} = A(startIdx:endIdx); 
end 

Тогда вы можете получить доступ к каждой строки в массиве ячеек:

a1 = out{1}; 
a2 = out{2}; 
... 
+0

+1 Вы можете использовать 1: x: length (A) вместо вычисления 'startIdx' и' endIdx'. Кроме этого, хороший ответ. –

0
A = 1:20; 
n = 3; 

% y = number of sets 
y = ceil(length(A)/n); 

ai = num2cell(reshape(A(1:n*y),m,n)'); 
if length(A) > n * y 
    ai = [ai; A(n*y+1:end)]; 
end 
Смежные вопросы