Как изменить диагональ матрицы в MATLAB?

#matlab #loops #diagonal #multiple-conditions

#matlab #циклы #диагональ #множественные условия

Вопрос:

У меня есть матрица 5×5, V1, со значениями и классификацией как в первой строке, так и в первом столбце. Если бы вы захотели, вы могли бы подумать о секторах экономики, у которых есть классификация. Первые два сектора имеют 3-значную классификацию, последние два имеют 4-значную классификацию.

 V1 =

             0         101         111        1234        1111
           101           4           0           7           0
           111           5           8           0           0
          1234           6           0           6           2
          1111           0           0           4           9
  

Теперь я хочу переопределить все столбцы с 4-значным кодом с помощью MATLAB. Это означает, что в четырехзначных столбцах значения должны суммироваться по всему столбцу и сдвигаться по диагонали. В частности, код должен выполнять следующие шаги:

  1. Если код классификации состоит из четырех цифр И код классификации одинаков как в первой строке, так И в первом столбце, затем суммируйте весь столбец (кроме. первое значение столбца, которое является самим кодом классификации)
  2. Кроме того, если классификационный код содержит три цифры в столбце, оставьте значение как есть
  3. Иначе присвоите ноль.

Результирующая матрица должна выглядеть следующим образом:

 V1 =

             0         101         111        1234        1111
           101           4           0           0           0
           111           5           8           0           0
          1234           6           0           17          0
          1111           0           0           0           11
  

Я пробовал следующий код, но он не сработал:

 [vrow vcol] = size(V1)
for c = 2:vcol;
   for r = 2:vrow;
        if all([ V1(1,c) == V1(r,1), numel(num2str(V1(1,c))) > 3, numel(num2str(V1(r,1))) > 3 ]) ;
           V1(r,c) = sum(V1(2:end,c)) ;
        elseif numel(num2str(V1(1,c))) == 3;
            V1(r,c) = V1(r,c);
        else
            V1(r,c) = 0;
        end
   end
end
  

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

 V1 =

               0         101         111        1234        1111
             101           4           0           0           0
             111           5           8           0           0
            1234           6           0          10           0
            1111           0           0           0           9
  

Спасибо за любые подсказки!

Ответ №1:

Поскольку вы меняете элементы V1 по мере выполнения кода, но также полагаетесь на значения в V1 для получения вашего ответа (при суммировании столбцов), у вас будут ошибки, если вы установите значение в 0 до того, как оно потребуется в сумме. Ниже я исправил эту проблему, инициализировав вторую матрицу V2 в качестве вашего вывода. Я также пошел дальше и удалил несколько ненужных строк, как объяснено в комментариях

 [vrow vcol] = size(V1);
V2 = zeros(vrow, vcol);
for c = 2:vcol;
   for r = 2:vrow;
        if all([ V1(1,c) == V1(r,1), numel(num2str(V1(1,c))) > 3]) ; %Third statement was redundant
            V2(r,c) = sum(V1(2:end,c)) ;
        elseif numel(num2str(V1(1,c))) == 3;
            V2(r,c) = V1(r,c);
        end %We intialized whole thing to 0, so we don't need to set elements to 0
    end
end