2016-10-10 8 views
2

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

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 

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

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

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

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 

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

ответ

0

Поскольку вы меняете элементы 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