2012-04-13 2 views
1

У меня есть набор данных, в котором я хочу извлечь столбцы 1-3, 7-9, 13-15, вплоть до конца матрицыMATLAB: извлечение групп столбцов в подматрицу?

В качестве примера я использовал стандартная функция магии, чтобы создать матрицу

A = магия (10)

A =

92 99  1  8 15 67 74 51 58 40 
98 80  7 14 16 73 55 57 64 41 
4 81 88 20 22 54 56 63 70 47 
85 87 19 21  3 60 62 69 71 28 
86 93 25  2  9 61 68 75 52 34 
17 24 76 83 90 42 49 26 33 65 
23  5 82 89 91 48 30 32 39 66 
79  6 13 95 97 29 31 38 45 72 
10 12 94 96 78 35 37 44 46 53 
11 18 100 77 84 36 43 50 27 59 

Я знаю, что я могу извлекать отдельные столбцы, начиная с 1, с интервалом в 3 с помощью команды:

AEX = а (:, 1: 3: конец)

AEX =

92  8 74 40 
98 14 55 41 
4 20 56 47 
85 21 62 28 
86  2 68 34 
17 83 49 65 
23 89 30 66 
79 95 31 72 
10 96 37 53 
11 77 43 59 

Скажем, я хочу, чтобы извлечь группы столбцов вместо этого (например, столбец 1-3, 7-9 и т. д.).

Есть ли способ сделать это, не указывая вручную все номера столбцов?

Благодарим за помощь! Rasmus

ответ

11

Это то, что вы ищете:

Aex = A(:,[1:3 7:9]) 

?

0

Я предполагаю, что вы хотите, чтобы результат был объединен в другую большую матрицу?

Если это так, попробуйте это для размера:

result = A(diag(0:2)*ones(3,floor((size(A,2) - 3)/6) + 1) + ... 
      ones(3,floor((size(A,2) - 3)/6) + 1)*diag(1:6:(size(A,2)-3))) 

Это, вероятно, может быть сокращен с некоторыми правилами матричной математики. Вы можете также параметризацию значения, так что он может быть изменен, чтобы сделать больше, чем то, что ожидает, что эта проблема, (а также, возможно, больше смысла),

a = 3;   
b = 6;   

result = A(diag(0:a-1)*ones(a,floor((size(A,2) - a)/b) + 1) + ... 
      ones(a,floor((size(A,2) - a)/b) + 1)*diag(1:b:(size(A,2)-a))) 

где a является размер «группы» (length([1 2 3]) = length([7 8 9]) = ... = 3), и т.д., и b является шаг колонн ([1...7...13...] в вашем примере)

Если вы хотите их отделили, я положил их в клетках здесь, но они могут пойти туда, куда вам нужно:

a = 3; 
b = 6; 
results = {}; 
for Cols = 1:b:(size(A,2)-a) 
    results{end+1} = A(:, Cols:(Cols+2)); 
end 

Я Бесполезный «т проверьте скорость любого из них, но я думаю, что первый из них может быть быстрее. Вы можете разделить его на термины, чтобы он был более читабельным, я просто сделал это, чтобы поместиться на одной строке (что не всегда является лучшим способом написания кода).

+1

wtf ???????????? (так много вопросительных знаков из-за ограничений SO на длине комментария) –

+0

@high Это так плохо? –

+0

Я не сказал, что это плохо, но я бы сказал, что это очень сложный способ сделать что-то, что имеет гораздо более простые формы в Matlab. Постарайтесь изо всех сил, и я не вижу никакой пользы в предлагаемом решении по сравнению с моими собственными усилиями. Я также отмечаю, что сообщество SO еще не подтвердило ваш ответ. Это все. –

0

Простой способ сделать это:

M = magic(10); 

n = size(M,2) 
idx = sort([1:3:n 2:3:n 3:3:n]) 
M(:,idx) 

Однако, если шаблон удаления проще, чем картина colums, что вы хотите, чтобы вы могли использовать вместо этого:

A = magic(10); 
B = A; 
B(:,4:3:end)=[]; 
B(:,4:3:end)=[]; %Yes 3x the same line of code. 
B(:,4:3:end)=[];