2015-12-19 2 views
2

У меня есть 2-мерный массив L, и я пытаюсь создать вектор линейных индексов ind для каждой строки этого массива.Как векторизовать sub2ind?

L= 
1 5 25 4 0 0 
2 3 3 45 5 6 
45 5 6 0 0 0 

Я использую lenr для хранения количества ненулевых элементов в каждой строке (начиная с колонки 1).

lenr= 
4 
6 
3 

Тогда я 1x45 массив RULES. Индексы, хранящиеся в L, относятся к элементам в RULES. Поскольку я хочу векторизовать код, я решил создать линейные индексы, а затем запустить RULES(ind).

Это отлично работает:

ind=sub2ind(size(L),1,lenr(1)); 

в то время как это не работает:

ind=sub2ind(size(L),1:3,1:lenr(1:3)); 

Есть идеи?

UPDATE:

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

rul=repmat(RULES,3); 
result = rul((L(1:J,1:lenr(1:J)))); 
+1

Просьба * * полный пример и объясните, что вы пытаетесь сделать. – excaza

+0

@excaze: Посмотрите мои обновления. –

+0

Почему вы используете '1: lenr (1: 3)' вместо 'lenr (1: 3)'? – excaza

ответ

0

Если я правильно интерпретировать ваши изменения, вы хотите создать переменную result, которая содержит элементы RULES, обозначенные ненулевыми элементами L. Обратите внимание, что в общем случае наилучшим способом векторизации sub2ind является использование sub2ind.

Если вы хотите result быть линейным массивом, вы можете просто написать

%// transpose so that result is ordered by row 
L_transposed = L.'; 
result = RULES(L_transposed(L_transposed>0)); 

Если, вместо этого, вы хотите result быть массивом того же размера, как L, со всеми числами в L заменены соответствующий элемент в RULES, это еще проще:

result = L; 
result(result>0) = RULES(result>0); 
Смежные вопросы