Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 15.10.2019
Сообщений: 18

Возникли трудности с поиском скалярного произведения

15.10.2019, 21:51. Показов 1830. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По условию дана целочисленная матрица X размера mxn. скалярное произведение двух векторов B и C = b1c1+b2c2+...bcn. Вывести на экран матрицу Y в которой элемент Yij равен скалярному произведению i-строки и j-столбца из матрицы X. Никак не могу понять как в программу корректно внести вычисление скалярного произведения. понимаю, что ниже полная ерунда по этой части, но все же приложу свой ход решения. Подскажите, пожалуйста где и что скорректировать. Уже все перепробовала

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
    int n,m,i,j,a,b,res=0;
 
    cout<<"M= ";
    cin>>m;
    cout<<"N= ";
    cin>>n;
    srand(unsigned(time(0)));
    
    int **arr=new int *[m];
    for(i=0; i<m; i++)
    {
        arr[i]=new int[n];
        for(j=0; j<n; j++)
        {
            arr[i][j]=rand()%51;
            cout<<arr[i][j]<<'\t';
        }
    cout<<endl;
    }
    cout<<endl;
    
    
    int **mas=new int *[m];
    for(i=0; i<m; i++)
    {
        mas[i]=new int[m];
        for(j=0; j<n; j++)
        {
            mas[i][j]=arr[i]*arr[j];
            cout<<mas[i][j]<<'\t';
        }
    cout<<endl;
    }
    cout<<endl;
    
return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.10.2019, 21:51
Ответы с готовыми решениями:

Возникли трудности(

Возникли трудности с задачей
Имеется задача : Родители Пети Торопыжкина затеяли ремонт. Однажды его послали в строительный магазин, чтобы купить c кг цементной смеси....

Возникли огромные трудности с задачей. (С++)
Возникли огромные трудности с данной программой. Помогите, если есть у кого-нибудь желание. Ближе к задаче: нам дан обычный текстовый...

9
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 22:57
Цитата Сообщение от VekYchis Посмотреть сообщение
Вывести на экран матрицу Y в которой элемент Yij равен скалярному произведению i-строки и j-столбца из матрицы X.
Как я понял, в матрице X в строках записаны векторы B, а в столбцах векторы C. Дальше было бы всё тривально, но
Цитата Сообщение от VekYchis Посмотреть сообщение
дана целочисленная матрица X размера mxn
Для скалярного произведения необходимо, что бы векторы принадлежали одному пространству, т.е. количество координат у них должно совпадать. Но в условии указано, что матрица X может быть неквадратной. Неувязочка-с
1
0 / 0 / 0
Регистрация: 15.10.2019
Сообщений: 18
16.10.2019, 17:48  [ТС]
Получается у этой задачи нет решения? В задании все сказано слово в слово как в первом сообщении.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
16.10.2019, 18:44
Цитата Сообщение от VekYchis Посмотреть сообщение
Получается у этой задачи нет решения?
В данной формулировке - нет.

Возможно надо проверить исходную матрицу m x n на m == n и выдать сообщение об ошибке, если условие не соблюдается.

Уточните у преподавателя условие задачи с учётом вышеизложенного.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
16.10.2019, 22:33
VekYchis, L0M,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <iterator>
#include <functional>
#include <random>
 
template<size_t size>
std::ostream& operator<<(std::ostream& out, const int(&a)[size]) {
    constexpr size_t N = std::sqrt(size);
    out << "{" << std::endl;
    for (size_t row = 0; row < N; ++row) {
        out << "    {";
        std::copy(a + row * N, a + (row + 1) * N, std::ostream_iterator<int>(out, ", "));
        out << "}," << std::endl;
    }
    out << "}" << std::endl;
    return out;
}
 
template<size_t size>
int mul(int (&a)[size], size_t row, size_t col) { 
    constexpr size_t N = std::sqrt(size);
    auto row_it = [&a, &row](size_t i) { return a[row * N + i]; };
    auto col_it = [&a, &col](size_t i) { return a[N * i + col]; };
    int ret = 0;
    for (size_t i = 0; i < N; ++i)
        ret += row_it(i) * col_it(i);
    return ret;
}
 
int main(int argc, char *argv[]) {
    const size_t N = 3;
    const size_t COUNT = N * N;
    int data[COUNT] = { 0 };
 
    std::random_device random_device;
    std::mt19937 generator(random_device());
    std::uniform_int_distribution<> distribution(0, 9);
    std::generate(data, data + COUNT, std::bind(distribution, std::ref(generator)));
    
    std::cout << data << std::endl;
    for (size_t row = 0; row < N; ++row) {
        for (size_t col = 0; col < N; ++col)
            std::cout << mul(data, row, col) << '\t';
        std::cout << std::endl;
    }
}
0
0 / 0 / 0
Регистрация: 15.10.2019
Сообщений: 18
17.10.2019, 17:37  [ТС]
тут матрица квадратная, всегда 3*3 и всегда с нулями по всем направлениям, увы

Добавлено через 4 минуты
эх. если опустить ненормативную лексику, то все в условии правильно и должно считать, нулевым не будет, под любые, заданные пользователем M и N должна строиться матрица и считаться по ней вторая матрица. :

Добавлено через 5 часов 28 минут
Цитата Сообщение от L0M Посмотреть сообщение
Как я понял, в матрице X в строках записаны векторы B, а в столбцах векторы C. Дальше было бы всё тривально, но

Для скалярного произведения необходимо, что бы векторы принадлежали одному пространству, т.е. количество координат у них должно совпадать. Но в условии указано, что матрица X может быть неквадратной. Неувязочка-с
Путем долгих переговоров пришли к выводу, что пользователь может ввести разные М и Н, под них составлена будет матрица А, в матрицу Х пойдет скалярное произведение только "квадратной части" матрицы А. т.е. сначала нужно сравнить М и Н, выбрать наименьшее из них, оно и будет размерностью матрицы Х. после этого соответственно формировать эту Х матрицу. Остался открытым вопрос как это сделать.

Добавлено через 4 часа 25 минут
вот такой код получился в итоге:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
    int n,m,x,i,j,a,b,res=0;
 
    cout<<"M= ";
    cin>>m;
    cout<<"N= ";
    cin>>n;
    srand(unsigned(time(0)));
    
    
    if (m>=n) x=n;
    else x=m;
    
    cout<<" Матрица A (ее часть), используемая в качестве исходной для построения матрицы В";
    
    int **arr=new int *[x];
    for(i=0; i<x; i++)
    {
        arr[i]=new int[x];
        for(j=0; j<x; j++)
        {
            arr[i][j]=rand()%51;
            cout<<arr[i][j]<<'\t';
        }
    cout<<endl;
    }
    
    cout <<" Новая матрица ";
    cout<<endl;
    
    int **arr2=new int *[x];
    for(i=0; i<x; i++)
    {
        arr2[i]=new int[x];
        for(j=0; j<x; j++)
        {
            arr2[i][j]=(arr[i][j]+arr[i+1][j+1]);
            cout<<arr[i][j]<<'\t';
        }
    cout<<endl;
    }
            
        
    cout <<endl;
 
return 0;
}
компиляция проходит ок, исходная матрица тоже формируется ок. а вот новая матрица не формируется, выдает ошибку:
bash: line 9: 24615 Segmentation fault (core dumped) ./a.out <<EOF
2 2
EOF


подскажите, где я ошибаюсь, что исправить в формировании второй матрицы?
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
17.10.2019, 23:59
Лучший ответ Сообщение было отмечено VekYchis как решение

Решение

outoftime, у меня ваш код не откомпилировался ни одним компилятором. (gcc, clang, vc)

Добавлено через 26 минут
VekYchis, поправил ваш варинт:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
 
    size_t n, m, x, i, j;
 
    cout << "M= ";
    cin >> m;
    cout << "N= ";
    cin >> n;
    //srand(unsigned(time(0)));
 
    if (m >= n) x = n;
    else x = m;
 
    cout << " Матрица A (ее часть), используемая в качестве исходной для построения матрицы В\n";
 
    long long** arr = new long long* [x];
    long long** arr2 = new long long* [x];
    for (i = 0; i < x; i++)
    {
        arr[i] = new long long[x];
        arr2[i] = new long long[x];
 
        for (j = 0; j < x; j++)
        {
            arr[i][j] = rand() % 51;
            cout << arr[i][j] << '\t';
 
            arr2[i][j] = 0;
        }
        cout << endl;
    }
 
    cout << " Новая матрица \n";
    cout << endl;
 
    for (i = 0; i < x; i++)
        for (j = 0; j < x; j++)
            for (size_t k = 0; k < x; ++k)
                arr2[i][j] += arr[i][k] * arr[k][j];
 
    for (i = 0; i < x; i++) {
        for (j = 0; j < x; j++)
            cout << arr2[i][j] << '\t';
        cout << endl;
    }
 
    cout << endl;
 
    for (i = 0; i < x; i++) {
        delete[] arr2[i];
        delete[] arr[i];
    }
    delete[] arr2;
    delete[] arr;
 
    return 0;
}
2
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
18.10.2019, 12:14
Цитата Сообщение от L0M Посмотреть сообщение
у меня ваш код не откомпилировался ни одним компилятором
Добавьте стандарт с++11 и пропущенный #include <algorithm>

Не по теме:

Я уже не говорю о том что на дворе 2019 и пора бы уже с++2a потехоньку да изучать

0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
18.10.2019, 13:13
Цитата Сообщение от outoftime Посмотреть сообщение
Добавьте стандарт с++11 и пропущенный #include <algorithm>
С++11 везде и так включен.
С #include <algorithm> откомпилировался только под gcc.
Цитата Сообщение от outoftime Посмотреть сообщение
Я уже не говорю о том что на дворе 2019 и пора бы уже с++2a потихоньку да изучать
Угу. Вы это производителям компиляторов расскажите.
1
0 / 0 / 0
Регистрация: 15.10.2019
Сообщений: 18
20.10.2019, 17:08  [ТС]
LOM, спасибо огромное!!!! Все работает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.10.2019, 17:08
Помогаю со студенческими работами здесь

Возникли трудности с функцией быстрой сортировки qsort
Добрый вечер. Есть массив прямоугольников со своей высотой и шириной, надо отсортировать отдельно по высоте, ширине и площади...

Нахождение скалярного произведения векторов
Известно два вектора Х(х1,х2...х10) и Y(y1,y2...y10). Нужно ввести свои значения и найти скалярное произведение векторов X*Y

Вычисления скалярного произведения векторов
Напишите подпрограмму вычисления скалярного произведения векторов произвольной размерности. Первый раз с такой темой сталкиваюсь. Я...

Обобщенное вычисление скалярного произведения
Здравствуйте! С помощью шаблонов (их рекурсивных вызовов) должен был посчитать произведение на этапе компиляции. Только ругается на...

Функции скалярного произведения и длины вектора
Здравствуйте, помогите с лабой, у самого не выходит. С++ В программе создать функцию, грамотно определив ее параметры и тип,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru