2015-04-17 3 views
1

Я пожарил от попытки сделать это успешно. У меня есть данные A в матрице с size(A) = [100 612]. Данные столбцов находятся в кусках 12 месяцев на 51 сайт, т. Е. 612 общих столбцов.Создать индекс MATLAB

Мне нужно создать индекс для выбора столбцов в этой последовательности; 1:51:612, а затем 2:51:612 и т. Д. До 51:51:612. Конечный массив должен быть столбцовой матрицей 100 строк по 612 с этой последовательностью

Row 1: Columns 1-12=(1,52,103,154,205,256,307,358,409,460,511,562) 
     Columns 13-24=(2,53,104,155,206,257,308,359,410,461,512,563) 
     ... 
     etc to the end of the first row with the last 12 columns with these numbers 
     Columns 601-612=(51,102,153,204,255,306,357,408,459,510,561,612). 

Затем повторяется 100 раз, чтобы дать 100 строк. Мне нужно это для использования в качестве логического индекса для извлечения или для повторной сортировки исходных данных в A, приведенных выше.

ответ

4

Вот один вкладыш с использованием permute и reshape

out = A(:,reshape(permute(reshape(1:612,51,[]),[2 1 3]),1,[])); 

Или вы могли бы просто избежать permute с помощью transpose

out = A(:,reshape(reshape(1:612,51,[]).',1,[])); 
+2

Кажется как вы, ребята, наконец, получили эти три мощных функции в хорошем использовании! – Divakar

+0

Ницца. Я должен был подумать использовать 'reshape'. – eigenchris

+1

@Divakar, anigenchris, Все зависит от вас, ребята. Никто не учил меня MATLAB, просто изучая ваши ответы, профиль и так далее. –

2

Следующий код должен работать:

months = 12; 
sites = 51; 

idx  = 1:sites:months*sites;   %// get array [1,52,103,...,562] 
final_idx = bsxfun(@plus,idx',[0:sites-1]); %'//add offsets to idx 
final_idx = final_idx(:)';     %'//get array elements in a row vector 

A_new = A(:,final_idx);      %// rearrange columns 
Смежные вопросы