#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. Это означает, что в четырехзначных столбцах значения должны суммироваться по всему столбцу и сдвигаться по диагонали. В частности, код должен выполнять следующие шаги:
- Если код классификации состоит из четырех цифр И код классификации одинаков как в первой строке, так И в первом столбце, затем суммируйте весь столбец (кроме. первое значение столбца, которое является самим кодом классификации)
- Кроме того, если классификационный код содержит три цифры в столбце, оставьте значение как есть
- Иначе присвоите ноль.
Результирующая матрица должна выглядеть следующим образом:
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