Если я правильно понимаю из того, что вы описали, ваше решение будет нуждаться в себя следующие этапы:
- цикл по строкам вашей матрицы, например
for row = 1:size(A, 1)
- Прокрутите элементы каждой строки, определите, где начинается каждый запуск нулей и сохраняются индексы и длина пробега. Например, вы можете получить матрицу вроде:
consecutiveZeroes = [ 2 1 2 ; 4 1 3 ; 4 6 5 ; 5 8 3 ]
, указывающую, что у вас есть пробег (2, 1) длины 2, пробег (4, 1) длины 3, пробег (4, 6) длины 5, и пробег в точке (5, 8) длины 3.
- Теперь перейдем к элементам B, подсчитывая количество элементов из каждого значения. Например, вы можете сохранить это как
replacementValues = [ 3 3 ; 2 5 ; 2 6 ; 3 2 ; 3 7 ]
, что означает три 3, два 5, два 6 и т. Д.
- Теперь возьмите строку из своей матрицы
consecutiveZeroes
и произвольно выберите строку replacementValues
, которая задает одинаковое количество элементов, замените нули в A
со значениями от replacementValues
и удалите строку из replacementValues
, чтобы показать, что вы ее использовали.
- Если в
replacementValues
нет строки, которая описывает достаточно длинный пробег значений для замены одного из ваших прогонов нулей, найдите комбинацию из двух или более строк из replacementValues
, которая будет работать.
Вы не можете сделать это с помощью всего одного прохода через матрицу, потому что предположительно вы могли бы иметь матрицу А, как [ 15 7 0 0 0 0 0 0 3 ; 2 0 0 0 5 0 0 0 9 ]
и вектор B, как [ 2 2 2 3 3 3 7 7 5 5 5 5 ]
, где вы можете только добиться того, что вы хотите, если вы используете четыре 5 и два 7, а не три 2 и три 3, чтобы заменить шесть нулей, потому что вы должны оставить 2 и 3 для двух прогонов из трех нулей в следующей строке. Самый простой подход, если эффективность не критична, вероятно, заключалась бы в том, чтобы запустить алгоритм несколько раз, пытаясь использовать разные случайные комбинации, пока вы не получите тот, который работает, но вам нужно будет решить, сколько раз попробовать, прежде чем сдаться, если на входных данных действительно будет нет решения.
Если вы застряли на любом из этих шагов, я предлагаю задать новый, более конкретный вопрос.
Можете ли вы уточнить, что вы подразумеваете под «перетасованными последовательными значениями» от B? В вашем примере это выглядит так, как будто вы случайно выбрали значение, которое встречается в B, а затем «израсходовало» все элементы B, имеющие это значение, чтобы заменить конкретный пробег нулей в A. Но имеет ли смысл замены значения совпадение длины прогона нулей, если возможно? Например, было бы хорошо, если бы четвертая строка результата была «5 5 3 96 96 3 3 7 7 7'? – nekomatic
Нет, значение подзаголовка от B с одинаковым номером должно быть последовательным. Можете ли вы дать мне решение?спасибо @nekomatic , и было бы хорошо, если бы не все значения из B могли быть распределены – 8727