2013-06-27 2 views
0

У меня есть матрица 10X3, и я хочу создать новую матрицу, используя только подмножество каждого столбца, но я хочу, чтобы подмножество было различным для каждого столбца на основе массива индексов и определенного диапазона от этой точки.Matlab: Как я могу менять столбцы независимо в матрице?

Например, если матрица (число не будет на самом деле идти в такой линейной моде, когда я делаю это):

A = ... 
    [1 11 21 
    2 12 22 
    3 13 23 
    4 14 24 
    5 15 25 
    6 16 26 
    7 17 27 
    8 18 28 
    9 19 29 
    10 20 30] 

и массив индекса pos = [5,16,24] с разбросом +/-3 (так 3 клетки по обе стороны каждой индексированной ячейки), то я хочу, чтобы новая матрица будет:

2 13 21 
3 14 22 
4 15 23 
5 16 24 
6 17 25 
7 18 26 
8 19 27 

таким образом, в новой матрице все значения, на которые ссылается массив индекса должен выстраиваться.

Я на самом деле делаю это с гораздо большими матрицами (до 400X100), поэтому я не уверен, что петли будут хорошей идеей ....

Спасибо за любые идеи!

ответ

3
shift   = 3; 

% Prevent out of bounds 
bread   = NaN(shift,size(A,2)); 
A    = [bread;A;bread] 
pos   = pos+shift; 

% Create mask 
B    = zeros(size(A)); 
B(pos-shift) = 1; 
B(pos+shift+1) = -1; 
B    = logical(cumsum(B)); 

% Select and reshape 
reshape(A(B),shift*2+1,numel(pos)) 
+1

Если это не будет 'поз + Shift + 1' и' сдвиг * 2 + 1 '? Я попробовал то, что вы разместили, и нижняя строка результата отсутствовала. – Dan455

+0

@ Dan455 Определенно правильно! – Oleg

+0

Теперь подождите, если вы попытаетесь получить какой-либо элемент из нижней строки ... – Dan455

0

Вот путь с arrayfun:

r = 3; % Spread range 
B = arrayfun(@(x) A(x-r:x+r)', pos, 'UniformOutput', false); 

B будет однако клетка, вы можете получить матрицу с: [B{:}].

1

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

r = 3; 
B = A(bsxfun(@plus, pos, (-r:r)'));