Как соединить два вектора в MATLAB?

Мне нужно соединить два вектора на основе условия, которое также принимает вектор в качестве аргумента. Пример:

vec_cond = -5:5;       % The exact values are calculated differently
vec1     = 0:10;
vec2     = 5:15;

Мне нужно, чтобы результирующий вектор состоял из значений из обоих векторов на основе условия из третьего вектора. Предположим, что это условие: vec_cond >= 0

Затем, если это так, я хочу, чтобы vec_result имел значения из vec1 по соответствующим индексам, а если нет, брал значения из vec2 по соответствующим индексам:

vec_result = vec1 if (vec_cond >=0) else vec2

Это часть моего сценария MATLAB (исходные комментарии были чешскими), где мне нужно было бы использовать это:

%% Draw output current and voltage characteristics
R       = 100:5:2*10^3;             % Load rezistor          [ohm]
U_2     = R .* (I * 10^(-3));       % Load voltage             [V]
U_1stab = U_LM + U_x + U_2;         % Min. required input voltage
                                    % for stabilization        [V]
U_delta = U_1 - U_1stab;            % Difference between actual and
                                    % min. req. input voltage  [V]
U_2norm = U_1 - U_LM - U_x          % Calculating output load
                                    % voltage based on params  [V]

I_z     = U_2norm ./ R .* 10^3;     % Load current param based[mA]
I_r1    = I * I_z.^0;               % Stabilizator current    [mA]

Таким образом, условие будет U_delta >= 0.

Я попытался использовать тернарный оператор, который нашел здесь:

I_graph = (U_delta >= 0) : (@() I) : (@() I_z);         % Current splice  [mA]
U_graph = (U_delta >= 0) : (@() U_2) : (@() U_2norm);   % Voltage splice   [V]

Это означает, что для I_graph, если условие выполнено, взять постоянное значение I и векторизовать его, иначе взять значения из I_z вектора. Для U_graph, если условие выполнено, взять значения из вектора U_2, в противном случае взять постоянное значение U_2norm и векторизовать его.

Но это не сработало, вот что мне пишет:

Operator ':' is not supported for operands of type 'function_handle'.

Error in vypocet1 (line 52)
I_graph = (U_delta >= 0) : (@() I) : (@() I_z);         % Current splice  [mA]

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


person Polda18    schedule 09.05.2021    source источник
comment
Я пытался использовать тернарный оператор (если что-то подобное существует в MATLAB, я нашел что-то, что может сказать, что это действительно так), но не сработало: I_graph = (U_delta >= 0) : (@() I) : (@() I_z); U_graph = (U_delta >= 0) : (@() U_2) : (@() U_2norm); Нашел здесь: mathworks.com/matlabcentral/cody/problems/   -  person Polda18    schedule 09.05.2021
comment
@CrisLuengo Я соответственно обновил вопрос, когда попробовал что-то, что не сработало. Я могу нарисовать график в MS Paint, чтобы показать, чего я хочу достичь. Предыстория необходима для того, чтобы понять цель. Но если вы хотите урезанную версию - я хочу соединить два вектора на основе условия, которое также принимает вектор в качестве аргумента. Пока условие истинно, используются значения из одного вектора, в противном случае мне нужны значения из другого. Python делает это очень простым, но мне нужно отформатировать график, и это кажется проще в MATLAB.   -  person Polda18    schedule 09.05.2021
comment
Я также мог бы рассчитать это в MS Excel, экспортировать значения в формате CSV и импортировать их в MATLAB в виде матрицы. Но это может быть еще сложнее.   -  person Polda18    schedule 09.05.2021
comment
Графики примерно, как я должен выглядеть: ctrlv.cz/WRcr   -  person Polda18    schedule 09.05.2021
comment
@CrisLuengo Вы хотите, чтобы я удалил электрические элементы, которые по сути являются основой расчета? Ну, я подумал, что это будет полезно. Если нет, то удалю.   -  person Polda18    schedule 09.05.2021
comment
Кроме того, это, вероятно, тоже дубликат, хотя его может быть трудно найти, потому что я не знаю, как его назвать...   -  person Cris Luengo    schedule 09.05.2021
comment
Обновлено @CrisLuengo   -  person Polda18    schedule 09.05.2021
comment
Кстати, кажется, что поворотный момент находится на индексе 188: ctrlv.cz/RrFC. нельзя просто предположить, что так будет всегда. Я сознательно выбрал конкретное значение на основе ранее рассчитанного результата из списка вариантов, но потому, что я не знаю, как это автоматизировать.   -  person Polda18    schedule 09.05.2021


Ответы (1)


Дано:

vec_cond = -5:5;
vec1     = 0:10;
vec2     = 5:15;

Вы можете установить:

out = vec2;
I = vec_cond >= 0;
out(I) = vec1(I);

При этом используется логическое индексирование, то есть индексирование с помощью логического массива.

Между прочим, тернарный оператор, который вы нашли, — это упражнение по перегрузке оператора : для определенного класса, чтобы он делал что-то, чего он обычно не делает. Обратите внимание, как вы используете двоеточие при создании vec_cond. Это то, что обычно делает оператор двоеточия.

person Cris Luengo    schedule 09.05.2021
comment
Попробую это. - person Polda18; 09.05.2021
comment
Спасибо, это сработало :) - person Polda18; 09.05.2021