2014-09-11 3 views
1

У меня есть произвольная n-на-n матрица. Я хочу посмотреть на множества столбцов и строк матрицы и сделать некоторый анализ на них, например, установив все элементы определенного набора строк и столбцов равными нулю. Для этого мне нужно проанализировать все комбинации строк и столбцов.Петли на матрице для просмотра всех комбинаций строк и столбцов

Например, если n = 3, процесс последовательно выбирает строку и столбцы 1, 2, 3, 12, 13, 23, 123 и создает новую переменную для каждой строки и столбца.

Я в настоящее время метод ниже для матрицы размером 4:

H = [some 4-by-4 matrix] 

for i1 = 1:n 
    for i2 = 1:n 
     for i3 = 1:n 
      for i4 = 1:n 

        % Set all rows and columns of all variables equal to 0 

        H(:,i1) = 0; 
        H(i1,:) = 0; 

        H(:,i2) = 0; 
        H(i2,:) = 0; 

        H(:,i3) = 0; 
        H(i3,:) = 0; 

        H(:,i4) = 0; 
        H(i4,:) = 0; 

        % Some more analysis on i1, i2, i3, i4... 

      end 
     end 
    end 
end 

Это очень грубый метод, но это, кажется, работает. Очевидно, что этот метод рассматривает множество (1,1,1,1), которое сначала эквивалентно только (1), то (1,1,1,2), что эквивалентно (1,2), то (1 , 1,1,3), что эквивалентно (1,3) ... и так далее ...

Проблема в том, что это не общий процесс для любой матрицы размера n, это только неочищенный процесс для матрицы размера 4.

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

Спасибо!

+0

Это кажется особым случаем применения [общего вопроса] (http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n -векторы) спросили и ответили Луи Мендо.Вы должны попытаться применить свое решение к своей проблеме, и если вы застряли, попросите еще раз. –

+0

Спасибо за это @TheMinion, я посмотрю на это сейчас :). – Owen

+0

Итак, индексы строк и столбцов будут одинаковыми во всех этих комбинациях? – Divakar

ответ

0

Вот аккуратный способ сделать это только с двумя циклами и без магической функции. Он использует двоичное представление целых чисел, чтобы решить, нужно ли обнулить столбец и строку.

Я просто исправить некоторые значения для теста

n = 3; 
Mat = rand(n,n); 

Тогда мы знаем, что существует 2^п комбинации, так что давайте пронумеровать их от 0 до 2^п-1:

for tag=0:2^n-1 

Мы делаем копию, чтобы сохранить исходную матрицу нетронутым

myMat = Mat; 

Теперь петля на строке и столбцах

for (i=1:n) 

Вот трюк: если i-й бит тега (в двоичном формате) равен 1, то мы обнуляем столбец и строку, иначе мы оставим его нетронутым.

 if (mod(floor(tag/2^(i-1)), 2) == 1) 
      myMat(:,i) = 0; 
      myMat(i,:) = 0; 
     end 
    end 

Наконец, чтобы проверить, что у нас есть то, что нам нужно.

myMat 
end 
2

Вы можете уменьшить произвольное количество петель в одном:

for k = 1:2^n-1 
    ind = dec2bin(k,n)=='1'; 
    H(ind,:) = 0; 
    H(:,ind) = 0; 
end 

Хитрость заключается в том, чтобы использовать только один цикл, чтобы создать логический индекс (ind), который говорит, который будет выбран столбцы. Таким образом, для n=4 переменная ind принимает значения [0 0 0 1], [0 0 1 0], [0 0 1 1], ... [1 1 1 1].

+0

@Divakar Вы имеете в виду, что '~ = 0' быстрее, чем' logical', правильно? –

+0

Да, я так думаю. Да, я имел в виду '~ = 0', т. Е. Любое сравнение может быть лучше, чем использование' logical' или 'not()' или 'pre-appending with ~'. – Divakar

+0

@Divakar Спасибо. Это также позволяет удалить вычитание –

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