2013-12-08 4 views
1

все.MATLAB: Шаг через итерации вектора

У меня есть элемент из 15 элементов = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] ;.

Мне было интересно, была ли команда такой, чтобы она проходила через итерации массива, не повторяясь. Другими словами, поскольку существует вероятность того, что randperm() будет создавать одну и ту же матрицу дважды, я хочу выполнить каждую перестановку только один раз и выполнить вычисление.

я признаю, что есть факторные (15) перестановок, но для моих целей, эти два вектора (и аналогичные) являются идентичными и не должен учитываться дважды:

[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] [15 14 13 12 11 10 9 8 7 6 5 4 3 2 1]

Таким образом, есть ли способ пройти через это?

Спасибо.

+2

Ваш вопрос очень неясно. Почему 1:15 идентичен 15: -1: 1? Вы смешиваете итерацию и перестановку в своем вопросе. – Daniel

+0

Для любого элемента i в тестовом векторе он рассматривает матричные «соединения», которые определяют, с какими узлами связан элемент i. Я пытаюсь смоделировать netlist, если это имеет смысл. Поскольку путь от перехода вперед по узлу такой же, как переход назад через узел, 1:15 идентичен 15: -1: 1, так как расположение элементов идентично относительно схемы. – dgikmo

ответ

1

Я думаю, что вы ищете, это perms. randperm возвращает одну случайную перестановку, вы хотите все перестановки.

Так используйте

my_permuations = perms([1:15]); 

Если вперед-назад так же, как отсталой-Foward, то вы можете использовать верхнюю половину только список ...

my_permutation_to_use = my_permutations(1:length(my_permutations)/2, :); 
+2

Вам нужно много памяти (или времени) для запуска 'perms ([1:15])' –

0

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

  • Перестановка действительна, если первый элемент меньше последнего элемента.
  • Перестановка избыточна, если первый элемент больше, чем последний элемент.

Для небольших размеров, это просто можно было бы сделать с этим кодом:

%generate all permutations 
x=perms(1:10) 
%select only the valid lines, remove all redundant lines 
x(x(:,1)<x(:,end),:) 

Остается проблемой, что генерация х для 1:15 разрывов всех пределов памяти и потребуется около 100 часов.

Смежные вопросы