2013-09-30 5 views
0

У меня есть вектор v. Мне нужно сформировать массив a, содержащий элементы, указанные в соответствии с другим массивом b. Каждая строка в a (обозначим ее r) должна содержать все элементы из v с начальными и конечными индексами, соответствующими первому и последнему элементам, указанным в соответствующем столбце в b. Например:Массив из вектора на основе второго массива

A(1, :) = v(b(1, 1):b(2, 1)); 
A(2, :) = v(b(1, 2):b(2, 2)); 
A(3, :) = v(b(1, 3):b(2, 3)); 

и так далее. Очевидно, b(2,:) = b(1,:) + constant.

Могу ли я сделать это без цикла в MATLAB?

+0

я могу думать только с помощью цикла. – umayfindurself

+0

Если вы можете добавить свое кодирование к вопросу, это поможет в ответе. – shunyo

+0

(и, возможно, дубликат): [оператор двоеточия Матлаба: значения между двумя векторами] (http://stackoverflow.com/questions/14341798/matlabs-colon-operator-values-between-two-vectors) –

ответ

1

Попробуйте это:

N=8; P=3; M=5; 
v = rand(N,1); 
b = zeros(2,M); 
b(1,:) = [1 2 4 5 6]; 
b(2,:) = b(1,:) + P - 1; 
A = cell2mat(arrayfun(@(i0,i1) v(i0:i1),b(1,:),b(2,:),'UniformOutput',false))' 
+0

Хорошая идея. Конечно, работы. Спасибо – umayfindurself

+0

Однако, просто чтобы указать, как обсуждалось [здесь] (http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why), хотя петли занимают больше места, они быстрее. – umayfindurself

+0

Из любопытства, зачем вам это нужно без петель? – chappjc

1

Вы можете использовать линейную индексацию и bsxfun для прямого доступа к элементам:

A = v(bsxfun(@plus, b(1,:).', 0:b(2,1)-b(1,1))); 
Смежные вопросы