Функция суммы Matlab от индекса к индексу - PullRequest
1 голос
/ 29 мая 2019

Я ищу лучший способ вычислить сумму всех элементов от индекса 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

Я бы хотел улучшить код, так как у меня есть ощущение, что проблема проста, но из-за недостатка опыта в matlab мой код слишком длинный.

Есть ли какая-нибудь функция, где я мог бы просто передать список индексов, и он будет выполнять ту же работу, что и код выше?

1 Ответ

1 голос
/ 29 мая 2019
  • Используйте array вместо cell
  • Также, поскольку все ваши cell_elements 1s, вы можете использовать матрицу ones(row, column)

Укажите row и column, здесь row is 1, а в столбце 100 это код

cell_elements = ones(1, 100)
  • Определить a как массив a = [1, 40, 77]
  • Первые 40 элементов - это элементы, имеющие индексы 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)
  • Для вторых 37 элементов индексы начинаются с 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

>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...