Функция суммы Matlab от индекса к индексу

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

obchardon 29.05.2019 12:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Используйте 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

>> 

да, но я ищу все значения между X и Y, а не соответствующие значения в индексах X и Y. Итак, я ищу аккуратный способ суммировать все между X, Y, или если я следую вашему примеру дано: a=[1,40,70] result = [1+1+1+1...+1, 1+1+1..+1] %первый элемент сумма 40, второй из 30, в если все элементы равны единице

CroatiaHR 29.05.2019 16:42

@CroatiaHR, "от индекса X к индексу Y" ... почему тогда у вас 3 индекса? Вы имеете в виду сумму от индекса 1 до индекса 40, затем сумму от индекса 40 до индекса 77?

Hoki 29.05.2019 18:02

Что ж, это довольно близко к тому, что я ищу. Но я считаю, что это не динамично, когда дело доходит до размера a. Таким образом, у вас есть определенный размер 3, но в моей программе я хочу сделать его гибким на случай, если он будет считывать размер. Я все равно отмечу это как ответ, так как вы ответили на приведенном примере, но я был бы рад, если бы вы могли дать мне повтор, если к нему есть динамический подход.

CroatiaHR 01.06.2019 16:34

@CroatiaHR проверьте ниже, я добавил динамический способ, используя for loop

Adam 01.06.2019 17:18

Другие вопросы по теме