2016-05-04 2 views
0

У меня есть массив в MatlabСохранение блоков векторных данных в массив в Matlab

A = [1 2 3 4 5 6 7 8 9; 
    67 67 67 86 86 86 86 67 67]'; 

, где каждая точка в первой строке A соответствует «коду» либо 67 или 86. Я пытаюсь извлечь эти блоки из "67s" и "86s", так что каждый раз, когда начинается блок, соответствующие элементы помещаются в 3-мерное измерение другого массива, называемого X, где.

Так, например, в A У меня есть 3 разных блока, поэтому я хотел бы получить массив X размером 1x9x3. И, например, первый блок 67 Я хотел бы иметь X

X(1,:,1) = [1 2 3]; 

Я понимаю, что я «завалить» этот вектор X, используя для цикла

for i=1:size(A,2) 
    for j=1:size(A,2) %actually j should be up till the number of blocks present 
    X(1,i,j) = A(1,i) 
    end 
end 

Но это не правильно или полностью, конечно, потому что, во-первых, я не уверен, как выделить «блоки» и как правильно «заполнить» j в X (1, ​​i, j). Во-вторых, как я могу получить код для распознавания количества блоков?

Может ли кто-нибудь помочь?

Благодаря

+0

Вы уверены, что ваш пример данные правильно? Поскольку у вас есть это, у вас есть 4 записи для '86'. – Suever

+0

@Suever да, блоки не равного размера! –

+1

В вашем примере, если 'X' является' 1x9x3', то 'X (1,:, 1)' должен быть массивом с 9 элементами, поэтому он не может содержать '[1 2 3]'. Предлагаю вам ознакомиться с вашим примером. –

ответ

0

Один из возможных подходов, основанных на this ответ:

>> B = accumarray([0; cumsum(diff(A(:,2)) ~= 0)] + 1, A(:,1), [], @(x) {x}, []) 

Теперь у вас есть это:

>> B{1} 

ans = 

    1 
    2 
    3 

>> B{2} 

ans = 

    4 
    5 
    6 
    7 

>> B{3} 

ans = 

    8 
    9 
Смежные вопросы