Как проверить / нет матрицу в массиве (Matlab) - PullRequest
0 голосов
/ 11 января 2012

У меня есть массив (M) матриц.Я выполняю операцию над матрицей в i-й позиции, и она добавляет еще три матрицы в мой массив в (3i-1), (3i) и (3i + 1) -й позиции.Я хочу продолжать этот процесс, пока не достигну j-й позиции в массиве, где j таков, что все матрицы в (j + 1) -й позиции и далее уже находятся где-то между позициями 1 и j (включительно).

РЕДАКТИРОВАТЬ: меня попросили уточнить, что я имею в виду.Я не могу написать код, который заставляет мой алгоритм завершать работу, когда я этого хочу, как описано выше.Если бы я знал правильный способ поиска по массиву матриц, чтобы проверить, содержится ли данная матрица, то я мог бы это сделать.Я попробовал следующее:

done = 0;    

ii = 1

    while done ~= 1

    %operation on matrix in ith position omitted, but this is where it goes

        for jj = ii+1:numel(M)

                for kk = 1:ii
                    if M{jj} == M{kk};
                        done = done + 1/(numel(M) - ii);
                        break
                    end
                end
        end

            if done ~= 1
                done = 0;
            end

    ii = ii + 1

    end

Проблема, с которой я столкнулся (как я уверен, вы можете видеть), состоит в том, что если процесс продолжается слишком долго, ошибки округления перестают когда-либо допускать done = 1,и алгоритм не заканчивается.Я попытался обойти это, введя пороги, что-то вроде

while abs(done - 1) > thresh

и

if abs(done - 1) > thresh
    done = 0;
end

Это заставляет алгоритм работать чаще, но у меня нет одного размера, подходящего для всех«порог, который я мог бы использовать (процесс мог продолжаться в течение сколь угодно большого количества шагов), поэтому он все равно заканчивает работу.

Что я могу сделать, чтобы это исправить?

Спасибо

1 Ответ

0 голосов
/ 11 января 2012

Почему бы вам не инициализировать выполнено в 0, оставить цикл while done == 0 и вместо вычислений, выполненных как сумма элементов, проверить, проверено ли ваше условие (обнаружение, существует ли матрица) для всех jj примерно так:

alldone=zeros(numel(M)-ii,1);

for jj = ii+1:numel(M)

        for kk = 1:ii
            if isequal(M{jj},M{kk})
                alldone(jj-ii) = 1
                break
            end
        end
end
done=prod(alldone);

Хотя, возможно, есть более элегантный способ кодирования. Например, вы можете добавить досрочное прекращение:

while done==0
done=1;
for jj = ii+1:numel(M)
    match_success=0;
    for kk = 1:ii
        if isequal(M{jj},M{kk})
            match_success=1;
            break
        end
    end
    if match_success==0
        done=0;
        break;
    end
end
end

В начале каждого цикла алгоритм предполагает, что он будет успешным и остановится там (следовательно, done = 1). Затем для каждого jj мы создаем match_success, который будет установлен в 1, только если совпадение найдено для M {jj}. Если совпадение найдено, мы ломаемся и переходим к следующему j. Если не найдено совпадений для j, match_success остается равным 0, done завершается, инициализируется равным 0, и цикл while продолжается. Я не проверял это, но я думаю, что это должно работать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...