Добавлять только существующие переменные в Matlab - PullRequest
2 голосов
/ 09 января 2020

Я хотел бы добавить суммы 5 одноколоночных массивов в Matlab. Уловка в том, что в зависимости от предыдущих входных данных любой из этих массивов может существовать или не существовать, что выдает ошибку, когда я пытаюсь добавить суммы этих массивов для последующей обработки.

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

exist('my_variable','var') == 1

Я не уверен, что это поможет мне в этом случае - В настоящее время строка, в которую я добавляю суммы различных массивов выглядят следующим образом:

tot_deviation = sum(var1) + sum(var2) + sum(var3) + sum(var4) + sum(var4);

Существует ли краткий способ добавления только сумм существующих массивов без чрезмерных циклов?

Любая помощь приветствуется!

Ответы [ 3 ]

3 голосов
/ 09 января 2020

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

1 - Инициализируйте все ваши переменные в массивы столбцов нулей с чем-то вроде var = zeros(nbLines, 1);

2 - Поместите все ваши векторы столбцов из стороны в сторону в одном массиве и используйте tot_deviation = sum(sum(MyArray));, который будет работать независимо от количества столбцов и строк в массиве.

3 - Если вы передадите свои переменные в Вы можете проверить количество входных аргументов внутри функции, используя 'nargin', а затем только суммировать правильное количество переменных.

Я бы порекомендовал использовать второй метод, так как мне кажется, что это тот, который позволяет вам использовать все преимущества системы массивов matlab, что хорошо.

3 голосов
/ 09 января 2020

Вы можете использовать if операторы:

if ~exist('var1','var'), var1 = 0;end
if ~exist('var2','var'), var2 = 0;end
if ~exist('var3','var'), var3 = 0;end
if ~exist('var4','var'), var4 = 0;end

tot_deviation = sum(var1) + sum(var2) + sum(var3) + sum(var4) + sum(var4);
1 голос
/ 09 января 2020

Самое надежное решение - инициализировать все ваши переменные в 0 в верхней части функции . Тогда нет никаких шансов, что они не существуют, и они правильно влияют на суммирование.


В качестве альтернативы ...

Вы могли бы (читай: не должен ) здесь использовать очень неприятный трюк eval для гибкости ...

vars = {'var1','var2','var3','var4'};
tot = 0;
for ii = 1:numel(vars)
    if exist(vars{ii}, 'var')
        tot = tot + eval(var);
    end
end

Я говорю, что это "противно", потому что eval следует избегать (прочитайте связанный блог). Проверка существования имени переменной смягчает некоторые противоречия, но все еще не идеальна.

Как предлагается в блоге MathWorks по evading eval , лучшим вариантом будет структура с динамичностью c имена полей. Вы можете использовать почти тот же синтаксис, что и выше, но замените оператор if на

if isfield( myStruct, vars{ii} )
    tot = tot + myStruct.(vars{ii});
end

Это позволит избежать динамически именованных переменных и сохранить ваше рабочее пространство чистым!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...