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

#matlab #vector #splice

Вопрос:

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

 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 цикла.

Комментарии:

1. Я попытался использовать тернарный оператор (если что-то подобное существует в MATLAB, я нашел что-то, что могло бы сказать, что это действительно так), но не сработало: I_graph = (U_delta >= 0) : (@() I) : (@() I_z); U_graph = (U_delta >= 0) : (@() U_2) : (@() U_2norm); Нашел это здесь: mathworks.com/matlabcentral/cody/problems/…

2. @CrisLuengo Я соответствующим образом обновил вопрос, когда попробовал что-то, что не сработало. Я могу нарисовать график в MS Paint, чтобы показать, чего я хочу достичь. Предыстория необходима для того, чтобы понять цель. Но если вам нужна разделенная версия — я хочу соединить два вектора на основе условия, которое также принимает вектор в качестве аргумента. Пока условие верно, используются значения из одного вектора, в противном случае мне нужны значения из другого. Python делает это очень просто, но мне нужно отформатировать сюжет, и в MATLAB это кажется проще.

3. Я мог бы также рассчитать это в MS Excel и экспортировать CSV значений и импортировать их в MATLAB в виде матрицы. Но это может быть еще сложнее.

4. Графики примерно так, как мне нужно было бы выглядеть: ctrlv.cz/WRcr

5. @CrisLuengo Вы хотите, чтобы я удалил электрические элементы, которые по сути являются основой для расчета? Ну, я подумал, что это будет полезно. Если нет, то я удалю его.

Ответ №1:

Дано:

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

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

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

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

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

Комментарии:

1. Собираюсь попробовать это.