Я ищу лучший способ вычислить сумму всех элементов от индекса X до индекса Y, если у меня есть список индексов. Например:
a = {1, 40, 77} % indexes
cell_elements = {1,1,1.....,1} %100 elements, each 1
Моя текущая идея выглядит примерно так:
counter = 1;
for k=1:length(cell_elements)
if (%Some condition) %condition is true for k=1,40 and 77
sum = sum+cell_elements(k);
result(counter) = sum;
sum=0;
counter = counter+1;
else
sum = sum+cell_elements(k);
end
end
Я хотел бы улучшить код, так как у меня есть ощущение, что проблематика проста, но из-за моего отсутствия опыта в матлабе мой код слишком длинный.
Есть ли какая-нибудь функция, где я мог бы просто передать список индексов, и он будет выполнять ту же работу, что и код выше?
Каков ожидаемый результат в данном примере? Почему вы используете вместо этого ячейку или массив? Что такое pkt_size
? Кстати, вы затеняете встроенную функцию sum
, если используете sum
в качестве имени переменной, что не рекомендуется.
array
вместо cell
cell_elements
все 1s
, вы можете использовать матрицу
ones(row, column)
Укажите row
и column
, здесь row is 1
и столбец 100
это код
cell_elements = ones(1, 100)
a
как массив a = [1, 40, 77]
1 to 40
в Matlab.
это эквивалентно 1:40
, чтобы включить массив a
,
с a(1) = 1 and a(2) = 40
; установить 1:40
как a(1):a(2)
Первые 40 элементов будутFirst_40_elements = cell_elements(a(1):a(2));
Чтобы суммировать их все вместе, используйте встроенную функцию Matlab sum
следующим образом.
Sum_First_40_elements = sum(First_40_elements)
41 to 77
в Matlab
записывается как 41:77
, используя массив a
, a(2)+1:a(3)
Second_37_elements = cell_elements(a(2)+1:a(3));
Sum_Second_37_elements = cell_elements(Second_37_elements);
cell_elements = ones(1,100);
a = [1,40,77];
First_40_elements = cell_elements(a(1):a(2));
Sum_First_40_elements = sum(First_40_elements);
% 40
Second_37_elements = cell_elements(a(2)+1:a(3));
Sum_Second_37_elements = sum(Second_37_elements);
% 37
cell_elements = ones(1,100);
a = [1,25,40, 67, 80, 95];
element_sum = zeros(1, length(a)-1);
for i = 1:length(a)-1
if i == 1
element_sum(i) = sum(cell_elements(a(i):a(i+1)));
else
element_sum(i) = sum(cell_elements(a(i)+1:a(i+1)));
end
end
>> element_sum
element_sum =
25 15 27 13 15
>>
да, но я ищу все значения между X и Y, а не соответствующие значения в индексах X и Y. Итак, я ищу аккуратный способ суммировать все между X, Y, или если я следую вашему примеру дано: a=[1,40,70] result = [1+1+1+1...+1, 1+1+1..+1] %первый элемент сумма 40, второй из 30, в если все элементы равны единице
@CroatiaHR, "от индекса X к индексу Y" ... почему тогда у вас 3 индекса? Вы имеете в виду сумму от индекса 1 до индекса 40, затем сумму от индекса 40 до индекса 77?
Что ж, это довольно близко к тому, что я ищу. Но я считаю, что это не динамично, когда дело доходит до размера a. Таким образом, у вас есть определенный размер 3, но в моей программе я хочу сделать его гибким на случай, если он будет считывать размер. Я все равно отмечу это как ответ, так как вы ответили на приведенном примере, но я был бы рад, если бы вы могли дать мне повтор, если к нему есть динамический подход.
@CroatiaHR проверьте ниже, я добавил динамический способ, используя for loop
Возможный дубликат Matlab: суммируйте соответствующие значения, если индекс находится в диапазоне