#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. Собираюсь попробовать это.