Matlab: полная и исчерпывающая индексация уникальных элементов с жадной перспективой

Пытаясь понять, как манипулировать двумя матрицами, имеющими следующие элементы (я попытаюсь упростить свою проблему, чтобы было легче ответить), расширив мой предыдущий вопрос:

Первая матрица:

          8 2 5
Mat1 = [  3 7 8 ] 
          6 5 0 

Вторая матрица:

         Value(Mat1(1)) Value(Mat1(4)) Value(Mat1(7))
Mat2 = [ Value(Mat1(2)) Value(Mat1(5)) Value(Mat1(8)) ]
         Value(Mat1(3)) Value(Mat1(6)) Value(Mat1(9))

Предположим, что значения второй матрицы:

              18 22 47
Val.Mat2 = [  28 84 82 ] 
              56 65 0

Теперь мы суммируем значения Val.Mat2: VM2CS = cumsum(sort(Val.Mat2)) и устанавливаем ограничение суммирования для каждого столбца cstr = 100; с результатами ограничения, собранными в матрице: result = sum(VM2CS <= cnstrn);

         18  22   0
VM2CS =  46  87  47
        102 171 129 

result = 2 2 2                            

######################## ПРОБЛЕМА (два аспекта с возрастающей сложностью) #################


  • Аспект первый: как cumsum может игнорировать элементы нуля (0); Итак, результат: result = 2 2 1. Я пробовал: result = sum(cumsum(sort(VM2CS))<=cstr ~=0) безуспешно.
  • Аспект второй: элементы Mat1 повторяются в матрице Mat2 (например, элемент Mat1(1) такой же, как Mat1(8) с другим значением, 18 и 82 соответственно. Mat1(6) и Mat1(7) тоже повторяются.). Как я могу использовать только один и тот же элемент в конечном результате с точки зрения того, чтобы иметь как можно больше уникальных элементов в строке (с исключением нуля (0))? Ожидаемый результат должен быть:
                     18 22 47
 result_expected = [ 28 54  0 ]
                      0  0  0

Я знаю, что на второй аспект нелегко ответить, но указание на решение также должно быть полезным. Те же полезные примеры были предложены профессором Thomas G. Robertazzi. на Планирование телекоммуникационных сетей, но я не У меня сейчас нет этой книги, и я не могу позволить себе купить ее.


person professor    schedule 06.12.2012    source источник


Ответы (1)


Для первой части просто используйте:

result = sum((VM2CS <= cstr) & (VM2CS ~= 0));

Что касается второй части, почему значение 56 исчезло?

person Smash    schedule 06.12.2012
comment
Спасибо за Ваш ответ. 56 удаляется, потому что сумма первых двух элементов с меньшим значением соответствует ограничению. @Разгромить. - person professor; 07.12.2012