2016-10-31 2 views
0

У меня есть эта матрица:Matlab заменить подряд нулевого значения с другими дорожат

A = [92 92 92 91 91 91 146 146 146  0 
     0  0 112 112 112 127 127 127 35 35 
    16 16 121 121 121 55 55 55 148 148 
     0  0  0 96 96  0  0  0  0  0 
     0 16 16 16 140 140 140  0  0  0] 

как можно заменить подряд нулевого значения с помощью перемешиваются последовательным значением из матрицы B

B = [3 3 3 5 5 6 6 2 2 2 7 7 7] 

требуемого результат, некоторая матрица, как это:

A = [92 92 92 91 91 91 146 146 146 0 
     6  6 112 112 112 127 127 127 35 35 
    16 16 121 121 121 55 55 55 148 148 
     7  7  7 96 96  5  5  3  3 3 
     0 16 16 16 140 140 140  2  2 2] 

большое спасибо ...

+0

Можете ли вы уточнить, что вы подразумеваете под «перетасованными последовательными значениями» от B? В вашем примере это выглядит так, как будто вы случайно выбрали значение, которое встречается в B, а затем «израсходовало» все элементы B, имеющие это значение, чтобы заменить конкретный пробег нулей в A. Но имеет ли смысл замены значения совпадение длины прогона нулей, если возможно? Например, было бы хорошо, если бы четвертая строка результата была «5 5 3 96 96 3 3 7 7 7'? – nekomatic

+0

Нет, значение подзаголовка от B с одинаковым номером должно быть последовательным. Можете ли вы дать мне решение?спасибо @nekomatic , и было бы хорошо, если бы не все значения из B могли быть распределены – 8727

ответ

1

Вы просто можете сделать это следующим образом:

[M,N]=size(A); 

for i=1:M 
    for j=1:N 
    if A(i,j)==0 
     A(i,j)=B(i+j); 
    end 
    end 
end 
+0

Я пробовал и результаты кода: Попытка доступа к B (14); index of bounds, потому что numel (B) = 13 – 8727

+0

это просто потому, что записанная последовательность B меньше, чем числа нулей, которые у вас есть в вашей матрице. Попробуйте расширить B равным или большим, чем числа ваших нулей. – kdrtkl

+0

Это заменит ** все ** нулевые значения в A со значениями из B, а не только на последовательные, что хочет ассер. Также запрос был для того, чтобы значения из B были «перетасованы». – nekomatic

0

Если я правильно понимаю из того, что вы описали, ваше решение будет нуждаться в себя следующие этапы:

  • цикл по строкам вашей матрицы, например 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 для двух прогонов из трех нулей в следующей строке. Самый простой подход, если эффективность не критична, вероятно, заключалась бы в том, чтобы запустить алгоритм несколько раз, пытаясь использовать разные случайные комбинации, пока вы не получите тот, который работает, но вам нужно будет решить, сколько раз попробовать, прежде чем сдаться, если на входных данных действительно будет нет решения.

Если вы застряли на любом из этих шагов, я предлагаю задать новый, более конкретный вопрос.