LINUX.ORG.RU

[matlab] Перебор всевозможных матриц

 


0

1

Как в матлабе реализуется перебор всевозможных матриц с элементами из определённого алфавита?

Максимум, что у меня получилось придумать, это функция next(), принимающая матрицу размерности n*m, возвращающая следующую в очерёдности матрицу тем же размером. Таким образом, можно перебрать все матрицы от zeros(n,m) до ones(n,m).

Но вся загвоздка в том, как вычислять это самое next()? Видимо, придётся сжимать матрицу в строку и ловко делать некое «+1», исходя из содержимого алфавита.

У кого-нибудь есть какие-нибудь идеи? Быть может, есть уже готовые встроенные средства для решения подобных задач?

Для бинарного алфавита велик получается примерно такой:

function B = next( A )
    [n,m] = size(A);
    B = A;
    if ( isequal( B, ones( n, m ) ) )
        return
    end
    
    i = n; j = m;
    while ( true )
        if ( B(i,j) == 0 )
            B(i,j) = 1;
            break
        end
        if ( B(i,j) == 1 )
            B(i,j) = 0;
            if ( j > 1 )
                j = j - 1;
            else
                j = size(A, 2);
                i = i - 1;
            end
        end
    end
end
garmonbozia
() автор топика

Декартово произведение (n*m) списков-элементов алфавита. Как в матлабе сделать не знаю.

AIv ★★★★★
()

Давно matlab не трогал...

#алфавит
abc = [4 5 7];
# Вы привыкли делать так
abc(1)

ans = 4

# А в матлабе можно так
abc([1 1 3; 2 3 1; 3 2 2])
ans =

   4   4   7
   5   7   4
   7   5   5

Это уже сводит задачу к простому пробегу по индексам.

А можно еще упростить жизнь, если свести все к работе с вектором, а не матрицей.

abc([1 2 3 1 2 3])
ans =

   4   5   7   4   5   7
reshape(abc([1 2 3 1 2 3]), 2, [])
ans =

   4   7   5
   5   4   7
transpose(reshape(abc([1 2 3 1 2 3), 3, []))
ans =

   4   5   7
   4   5   7
Belkrr
()
Ответ на: комментарий от Belkrr

Еще забыл добавить. Если внезапно нужны все варианты одновременно, а не последовательно fullfact сгенерит все возможные наборы индексов.


# Алфавит
abc = [98 123 432];
# Все возможные вектора длины 2 из этого алфавита
abc(fullfact(length(abc) .* ones(2)))
ans =

    98    98
    98   123
    98   432
   123    98
   123   123
   123   432
   432    98
   432   123
   432   432
Belkrr
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.