Easyelectronics.ru

Электроника для всех
Текущее время: 20 сен 2020, 20:27

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:02 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
Доброго времени суток. Есть массив из 100 элементов. В нем содержится 10 наборов по 10 значений (но в виде одномерного массива на 100 элементов !!!).
И есть массив из 10 других значений (назовем их коэффициентами). Необходимо каждое из значений каждого набора умножить на соответвтующий коефициент. То есть 2-й элемент массива умножить на 2-й "коэффициент", 23-й элемент массива умножить на 3-й коэффициент, 47-й элемент массива умножить на 7 коэффициент, и т.д.
Пока сделал так: "размножил" массив коэффициентов до размерности основного массива (сделал по 10 копий каждого коэффициента), чтобы каждому элементу основного массива соответствовал "свой" коэффициент. Понятное дело что получил оверхед по памяти, но зато получился простой цикл перебора типа:
Show

Чтобы не делать такой оверхед с k_array, вижу способ сделать array в виде двухмерного массива 10*10.
А как лучше сделать, не переходя на двухмерное представление исходного массива ?


Последний раз редактировалось Gnusmas 15 мар 2019, 21:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:12 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3457
for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) array[10*i+j] *= k_array[j];


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:23 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Двухмерный массив тождественнен двум одномерным, расположенным друг за другом. Индексы двухмерного, наоборот, усложнят доступ к элементу.
Поскольку коэффициенты в одном массиве соответствуют по порядку элементам другого массива, используйте одну и ту же переменную для обеих массивов.
Кстати, можно это решить с помощью инкремента указателей.
Конкретная реализация в машинных кодах зависит от компилятора и примененного уровня оптимизации. В общем случае, инкремент указателей работает быстрее, чем индексы, поскольку позволяет использовать машинную инструкцию постинкремента.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:30 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Цитата:
И есть массив из 10 других значений (назовем их коэффициентами). Необходимо каждое из значений каждого набора умножить на соответвтующий коефициент. То есть 2-й элемент массива умножить на 2-й "коэффициент", 23-й элемент массива умножить на 3-й коэффициент, 47-й элемент массива умножить на 7 коэффициент, и т.д.


Ну дык элементарно ведь. Вам нужена последняя цифра индекса, а она всегда для unsigned integer будет равна остатку от деления на 10:
Код:
for (i = 0; i < 100; i++)
  array[i] *= k_array[i % 10];


Не надо ничего раскладывать и дополнять, зачем эти извращения.

EDIT:
На Cortex-M3 это кстати будет уже gcc собрано просто на инструкциях, даже без вызова подпроцедур для получения остатка от деления:
Код:
   4:   4b0a            ldr     r3, [pc, #40]   ; (30 <main+0x30>)
   6:   fba3 1302       umull   r1, r3, r3, r2
   a:   08db            lsrs    r3, r3, #3
   c:   eb03 0383       add.w   r3, r3, r3, lsl #2
  10:   0059            lsls    r1, r3, #1
  12:   1a51            subs    r1, r2, r1

На M0 вызывается подпроцедура:
Код:
   6:   210a            movs    r1, #10
   8:   0020            movs    r0, r4
   a:   f7ff fffe       bl      0 <__aeabi_uidivmod>


Последний раз редактировалось NStorm 15 мар 2019, 17:56, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:44 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3516
:)


Последний раз редактировалось iev91 19 май 2019, 15:41, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:46 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Зачем 10х10?
array[2][10] имеет 2х10 элементов и равнозначен двум массивам array1[10] и array2[10], расположенным друг за другом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:47 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
BusMaster, так у ТС 10 на 10 ведь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:51 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Тоже - зачем 10х10?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:52 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
BusMaster, это вы у ТС спросите "зачем". У него именно 100 элементов массива, т.е. 10х10. А не 2х10.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 17:57 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
2х10 - это для примера.
У ТС-а 100 значений + 10 коэфф-в, я правильно понял?
Идем наоборот - перебираем массив коэфф-в.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 18:00 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Цитата:
У ТС-а 100 значений + 10 коэфф-в, я правильно понял?

Да.

Цитата:
Идем наоборот - перебираем массив коэфф-в.

Можно, только зачем. Задача элементарно реализуется через остаток от деления нацело, как я написал.
В общем случае, когда массив коэф не равен 10, всё-равно также всё делается:
Код:
for (i = 0; i < sizeof(array); i++)
  array[i] *= k_array[i % sizeof(k_array)];


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 18:04 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
NStorm писал(а):
Ну дык элементарно ведь. Вам нужена последняя цифра индекса, а она всегда для unsigned integer будет равна остатку от деления на 10:
Код:
for (i = 0; i < 100; i++)
  array[i] *= k_array[i % 10];

Не надо ничего раскладывать и дополнять, зачем эти извращения...

Понимаю, что выгляжу совсем как "заказчик, на лету меняющий ТЗ", но все же, а если у меня будет массив float ? Хотелось бы универсальное решение. Заранее прошу прощения за наглость.

Про % прочитал - "Не пытайтесь производить данную операцию над числами с плавающей точкой она просто не будет выполняться".


Последний раз редактировалось Gnusmas 15 мар 2019, 18:07, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 18:06 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Дык содержимое и тип массива не важен совсем. Что угодно делайте внутри цикла. Решение абсолютно универсальное, я в пред. посте написал для общего случая массивов любой размерности. Индексы массивов в C всегда целочисленные ведь, а мы остаток от целочисленного деления берем именно у индексов массива, а не их содержимого ведь.
Цитата:
% - Не пытайтесь производить данную операцию над числами с плавающей точкой она просто не будет выполняться.

Никто и не пытается. Она проводится над i, которое где-то у вас должно быть объявлено как unsigned integer - это ведь просто счетчик для перебоки элементов массива.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 18:10 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
NStorm писал(а):
Никто и не пытается. Она проводится над i, которое где-то у вас должно быть объявлено как unsigned integer - это ведь просто счетчик для перебоки элементов массива.

Ага... Моя вроде догнала...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 18:17 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2867
Только единственное что sizeof надо будет делить на размерность элемента массива (/ sizeof(type)), или задать размеры массивов где-то дефайном (так лучше в плане оптимизации наверное будет).
В общем случае, к примеру для размеров 125 и 25:
Код:
float array[125]; // здесь массив элементов любого размера
float k_array[25]; // здесь массив коэффициентов любого размера

for (uint32_t i = 0; i < sizeof(array)/sizeof(float); i++)
  array[i] *= k_array[i % sizeof(k_array/sizeof(float))];


И 2ой вариант:
Код:
#define ARRAY_SIZE 125
#define K_ARRAY_SIZE 25

float array[ARRAY_SIZE];
float k_array[K_ARRAY_SIZE];

for (uint32_t i = 0; i < ARRAY_SIZE; i++)
  array[i] *= k_array[i % K_ARRAY_SIZE];


PS: Тип переменной i берется в зависимости от платформы и размеров вашего первого массива. Это простой счетчик для перебора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Умножение элементов массива на элементы другого массива
СообщениеДобавлено: 15 мар 2019, 18:25 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 980
Откуда: Earth
NStorm писал(а):
PS: Тип переменной i берется в зависимости от платформы и размеров вашего первого массива. Это простой счетчик для перебора.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB