Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33

Медленно заполняется массив при расчете с циклами

02.10.2019, 21:35. Показов 1521. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго вечера! В матлаб новичек. Пытаюсь реализовать определенный экономический расчет на основании массива данных. При этом пользуюсь циклами. Перед заполнением массива задаю размерность, и все равно массив заполняется около 30 минут, а это не годится поскольку таких вычислений с записью в последующем будут еще. Возможно кто-то знает, в чем тонкость данного вопроса. Спасибо за внимание!

Код имеет следующий вид:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PROD1 = zeros(length(find(strcmp(table2array(F_loc(:, 2)), 'естественные') ~= 1)), size(fertilizer_payback, 1)+1);
n = 0;
for i = 1:size(F_loc, 1)
   k = 1;
   if strcmp(table2array(F_loc(i, 2)), 'естественные') ~= 1
       n = n+1;
       PROD1(n, 1) = table2array(F_loc(i, 1));
      while k <= size(fertilizer_payback, 1)
          field_id = table2array(F_loc(i, 1));
          culture_id = table2array(fertilizer_payback(k, 1));
          product_id = table2array(fertilizer_payback(k, 2));
          prod1 = getProductivity(field_id, culture_id, product_id); % в этой функции также внутри есть цикл с обработкой массива данных.
          PROD1(n,k+1) = prod1;
          k = k+1;
      end
   end
end
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2019, 21:35
Ответы с готовыми решениями:

Grid заполняется данными слишком медленно
Ребят подскажите пожалуйста. Вот проект, он состоит из грида и кнопок, меня пока интересует одно, как сделать, что бы при загрузке грида,...

Нормально ли, что Vector так медленно заполняется ?
Здравствуйте, Подскажите пожалуйста, это нормально, что данный код выполняется 20 секунд!? :( int main() { ...

После сортировки проверяю двумя циклами. Почему проверка идет очень медленно?
Всем привет. Клонирую элементы в переменную, потом создаю пары и записываю их в массив, после чего сортирую так как хочу. Потом по...

23
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
02.10.2019, 21:44
Покажите getProductivity() и прикрепите все необходимые данные
0
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
02.10.2019, 21:50  [ТС]
main.m
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
clear; clc; 
 
setDataBase();
 
PROD1 = zeros(length(find(strcmp(table2array(F_loc(:, 2)), 'естественные') ~= 1)), size(fertilizer_payback, 1)+1);
n = 0;
for i = 1:size(F_loc, 1)
   k = 1;
   if strcmp(table2array(F_loc(i, 2)), 'естественные') ~= 1 
       n = n+1;
       PROD1(n, 1) = table2array(F_loc(i, 1));
      while k <= size(fertilizer_payback, 1)
          field_id = table2array(F_loc(i, 1));
          culture_id = table2array(fertilizer_payback(k, 1));
          product_id = table2array(fertilizer_payback(k, 2));
          prod1 = getProductivity(field_id, culture_id, product_id);
          PROD1(n,k+1) = prod1;
          k = k+1;
      end
   end
end
setDataBase.m
Matlab M
1
2
3
4
5
6
7
8
9
10
11
global fertilizer_payback Sub F_loc S_scor
 
% экспортируем данные из .xls файла в массив
fertilizer_payback =  readtable('functional_database.xls', 'Sheet', 'fertilizer_payback');
F_loc = readtable('incoming_database.xls', 'Sheet', 'F_loc');
% CR = readtable('incoming_database.xls', 'Sheet', 'CR');
S_scor = readtable('incoming_database.xls', 'Sheet', 'S_scor');
% HF = readtable('incoming_database.xls', 'Sheet', 'HF');
% NP = readtable('incoming_database.xls', 'Sheet', 'NP');
% MTFP = readtable('incoming_database.xls', 'Sheet', 'MTFP');
% FC = readtable('incoming_database.xls', 'Sheet', 'FC');
getProductivity.m
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
function prod1 = getProductivity(field_id, culture_id, product_id)
global fertilizer_payback S_scor 
  for i = 1:size(fertilizer_payback, 1)
      if table2array(fertilizer_payback(i, 1)) == culture_id && table2array(fertilizer_payback(i, 2)) == product_id 
         for k = 1:size(S_scor, 1)
            if table2array(S_scor(k, 1)) == field_id
                prod1 = table2array(S_scor(k, culture_id + 20)) * table2array(fertilizer_payback(i, 5)) / 100;
            end
         end
      end           
  end
end
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
02.10.2019, 21:54
Есть шанс увидеть Excel файл?
0
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
02.10.2019, 22:09  [ТС]
Нельзя опытные данные. Там размернасть не большая в основном файле до 600на20 ячеек, цыфры х.0000
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
02.10.2019, 22:12
Я бы избавился от global и на массивы везде перешел (на цыфры). Постоянно конвертируете table2array
1
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
02.10.2019, 22:38  [ТС]
Если нет глобальной переменой, то как вызвать кастомную функцию?
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
02.10.2019, 22:52
Цитата Сообщение от levlol Посмотреть сообщение
Если нет глобальной переменой, то как вызвать кастомную функцию?
Анекдот?
Тут можно еще Break добавить. Нет смысла до самого конца катать
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function prod1 = getProductivity(field_id, culture_id, product_id)
% global fertilizer_payback S_scor 
  for i = 1:size(fertilizer_payback, 1)
      if table2array(fertilizer_payback(i, 1)) == culture_id && table2array(fertilizer_payback(i, 2)) == product_id 
         for k = 1:size(S_scor, 1)
            if table2array(S_scor(k, 1)) == field_id
                prod1 = table2array(S_scor(k, culture_id + 20)) * table2array(fertilizer_payback(i, 5)) / 100;
                break;
            end
         end
         break;
      end           
  end
end
1
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
03.10.2019, 06:40
Цитата Сообщение от levlol Посмотреть сообщение
Нельзя опытные данные.
Поменяйте данные, поставьте их "от фонаря" и возьмите по нескольку ячеек, не полностью таблицы. Нужно глянуть структуры таблиц.
0
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
03.10.2019, 12:38  [ТС]
По рекомендациям nuHrBuH, убрал некоторые функции конвертации table2array в циклах, однако из-за этого пришлось проводить декомпозицию таблицы на численные и строковые столбцы. Только после этого время выполнения расчета уменьшилось до 44.412273 seconds. Это все еще много? Спасибо. Буду искать дальше резервы уменьшения время выполнения.

Добавлено через 10 минут
Убрал полностью все table2array в циклах, получилось 6.287982 seconds. Это нормально или могут быть еще резервы оптимизации?
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
03.10.2019, 13:22
Я все еще хочу убрать global
Matlab M
1
2
function prod1 = getProductivity(field_id, culture_id, product_id,fertilizer_payback, S_scor)
% global fertilizer_payback S_scor
0
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
03.10.2019, 13:32
Цитата Сообщение от levlol Посмотреть сообщение
Это нормально или могут быть еще резервы оптимизации?
Могут, если отказаться от циклов.
0
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
03.10.2019, 14:56  [ТС]
тогда ошибка: Undefined function or variable 'S_scor'.

Добавлено через 4 минуты
Забыл добавить в функцию данные массивы как входящие аргументы, но все равно время осталось прежнее, значит глобальные переменные не влияют

Добавлено через 17 минут
Не могли-бы вы дать ссылку на материал, с данными примерами, где нужна прогонка по массиву с условиями и реализовано без использования циклопов. спасибо.
0
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
03.10.2019, 16:26
Цитата Сообщение от levlol Посмотреть сообщение
без использования циклопов
Ну зачем же привлекать циклопов, пусть они себе мирно живут в древнегреческих мифах

А по существу, например, можно строки
Matlab M
1
2
3
if strcmp(table2array(F_loc(i, 2)), 'естественные') ~= 1 
       n = n+1;
       PROD1(n, 1) = table2array(F_loc(i, 1));
заменить на
Matlab M
1
PROD1=F_loc.имя первого столбца(F_loc.имя второго столбца~='естественные');
Кроме того, у вас в функции getProductivity.m в prod1 запишется только результат последней итерации, а предыдущие итерации, получается, выполнялись напрасно. Поэтому хотелось бы узнать, как должно быть на самом деле.
1
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
03.10.2019, 18:49  [ТС]
та строка что вы посоветовали выдает ошибку при сравнении с текстом - Undefined operator '~=' for input arguments of type 'cell'. Однако с цифрами работает замечательно. Спасибо.
0
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
03.10.2019, 19:28
Цитата Сообщение от levlol Посмотреть сообщение
Undefined operator '~=' for input arguments of type 'cell'
Так я не знал, что у вас там ячейки. Поэтому и просил вас показать структуру ваших таблиц.
0
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 33
03.10.2019, 19:33  [ТС]
идентифицировать таким образом значения столбца как вы предложили только по числам, по строковым ячейкам никак? не разбираюсь в мат части этих процессов просто.
0
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
03.10.2019, 21:10
Используйте вариант
Matlab M
1
PROD1=F_loc.имя первого столбца(~strcmp(F_loc.имя второго столбца,'естественные'));
И повторю вопрос про getProductivity.m: как правильно должно быть?
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
03.10.2019, 21:14
Цитата Сообщение от nuHrBuH Посмотреть сообщение
Тут можно еще Break добавить. Нет смысла до самого конца катать
Я Вам соврал. Так должно быть:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
function prod1 = getProductivity(field_id, culture_id, product_id)
% global fertilizer_payback S_scor 
  for i = 1:size(fertilizer_payback, 1)
      if table2array(fertilizer_payback(i, 1)) == culture_id && table2array(fertilizer_payback(i, 2)) == product_id 
         for k = 1:size(S_scor, 1)
            if table2array(S_scor(k, 1)) == field_id
                prod1 = table2array(S_scor(k, culture_id + 20)) * table2array(fertilizer_payback(i, 5)) / 100;
                return
            end
         end
      end           
  end
end
0
Модератор
 Аватар для Centurio
1765 / 1610 / 541
Регистрация: 13.09.2015
Сообщений: 5,629
03.10.2019, 21:25
nuHrBuH, у вас тоже получается, что на выходе в prod1 будет значение для последней итерации, а предыдущие итерации зазря проходят.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2019, 21:25
Помогаю со студенческими работами здесь

Чем заполняется DMA массив при перекачке из 8бит в 16/32бит?
Это касается UART, ADC и т.п.. Стандартизовано ли это? Если ширина источника 8бит, а массива в памяти 16 или 32 бит, то оставшиеся 8 и 24...

Массив: При нажатии на кнопку каждый textbox заполняется одним случайным элементом массива
Доброе утро!Помогите с реализацией.Приложение такое:есть текстбоксы и кнопка. При нажатии на кнопку каждый textbox заполнялся одним...

Не сходятся токи при свёртке схемы и при расчёте по законам Кирхгофа (комплексная форма)
Добрый день, очень нужна ваша помощь. Не сходятся токи при свёртке схемы и при расчёте по законам Кирхгофа, сижу битый час, смотрю в...

Ошибка при расчете
Решаю задание и при наборе команды выскочила ошибка что здесь не так ?? пробовала поменять но не получилось подскажите в чем моя ошибка

Заполнить массив строк из файла. Массив заполняется, но выводится не корректно
Здравствуйте! Такая проблема. В файле имена записаны в столбик и разделены точкой с запятой. Массив заполняется, но выводится не корректно....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru