Matlab - вычесть 1 вектор из другого в массиве struct - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно использовать разные структурные массивы (в том же файле Matlab), что я хочу, чтобы взять 1 параметр / вектор из переменной в массиве структуры и вычесть его с другими параметрами из другой переменной в другом массиве структуры, этовозможно?

Вот небольшая часть моего кода:

Dist(1).name = 'Pristina'
Dist(1).KM_To_Fushe_ks = 13.7   % 199-13.7 = 
Dist(1).KM_to_Lipjan = 8.7      % 199-8.7  =
Dist(1).KM_to_Sllatina = 4.2    % 199-4.2  =
Dist(1).KM_to_Hajvali = 3.5     % 199-3.5  =
Dist(1).KM_to_Mitrovica = 46.9  % 199-46.9 = 
Dist(1).KM_to_Anija = 1.9       % 199-1.9  =



EV(1).name = 'Nissan Leaf 24 kWh pack'
EV(1).RangeInKM_By_Manufacturer = 199 %SUBTRACT this with parameters above:
EV(1).Battery_Capacity = 21.6
EV(1).Battery_Warranty_KM = 100000
EV(1).Battery_Warrany_Year = 5
EV(1).EnginePower_Kw = 80
EV(1).EnginePower_hK = 109
EV(1).Torque_in_NewtonMeter = 254
EV(1).QuickCharging_type = 'CHAdeMO'
EV(1).QuickChargingEffect_kW_DC = 50
EV(1).NormalCharging_OnBoard_kW_AC = 3.3
EV(1).Seats = 5
EV(1).Luggage_in_Liters = 370
EV(1).Consumption_Mixed_kWh_per_10km_NEDC = 1.5
EV(1).Weight_Without_Driver = 1475
EV(1).TopSpeed_KM_per_hour = 144
EV(1).Acceleration_0to100KM_per_hour = 11.5
EV(1).RangeInKM_By_Manufacturer_RANK = 10

То, что я хочу, это иметь число от 199 как вектор, и вычесть его всеми этими числами = [13.7, 8.7, 4.2, 3.5, 46.9, 1.9]

Как это сделать?

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вот одно из решений моей проблемы:

distances = [KM_to_Fushe_KS, KM_to_Lipjan];


remainingrange = arrayfun(@(s) s.RangeInKM - distances, EV, 'UniformOutput', false)

Или я мог бы сделать это:

remainingrange = cell(size(EV));
for evidx = 1:numel(EV)
    remaingrange{evidx} = EV(evidx).RangeInKM - distances;
end
0 голосов
/ 22 мая 2018

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

Пример:

Towns = {'Town1', 'Town2', 'Town3', 'Town4'};
distances = [0 200 13.7 8.7;
             200 0 13.3 9.3;
             13.7 13.3 0 255;
             8.7 9.3 255 0];


EVs = {'Nissan Leaf 24 kWh pack', 'Nissan Leaf 30 kWh pack'};
ranges = [199 250];

И тогда я могу рассчитать расстояния как трехмерную матрицу:

remainingrange = permute(ranges, [1 3 2]) - distances;  
remainingrange = bsxfun(@minus, permute(ranges, [1 3 2]), distances); 

Если я хочу проверить, не хватает ли EV в KM, я мог бы написать:

 tooFarForMyEV = find(remainingrange < 0)
 [from, to, ev] = ind2sub(size(remainingrange), tooFarForMyEV);
 lackingrange = table(Towns(from)', Towns(to)', EVs(ev)', remainingrange(tooFarForMyEV), 'VariableNames', {'From', 'To', 'EV', 'Deficit'})
0 голосов
/ 15 мая 2018

Возможно, я неверно истолковал ваш вопрос, но, похоже, это работает:

EV(1).RangeInKM_By_Manufacturer = 199 - Dist(1).KM_To_Fushe_ks 

В строке, которую вы цитируете в своем вопросе, вы оставили инициализацию KM_To_Fushe_ks после разницы; Короче говоря, вы не можете иметь различные назначения в одной команде. Кроме того, если вы заканчиваете свои строки точкой с запятой, вы подавляете вывод в командное окно. Как это:

Dist(1).name = 'Pristina';
Dist(1).KM_To_Fushe_ks = 13.7;   
Dist(1).KM_to_Lipjan = 8.7;    
% Etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...