powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Умножение матриц
12 сообщений из 62, страница 3 из 3
Умножение матриц
    #38672462
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Я ещё не знаю Си. Потому мне рано изучать С++.

Нужно решить эту классическую задачу в рамках Си
...
Рейтинг: 0 / 0
Умножение матриц
    #38672480
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Это все равно что сказать -
Я ещё не научился ездить на автомобиле. Потому мне рано летать самолетами.
Нужно решить эту классическую задачу поездки на Карибы в рамках езды на автомобиле
...
Рейтинг: 0 / 0
Умножение матриц
    #38672484
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну С так С.

Вот схематично как это решается.
Код: plaintext
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.
struct matrix 
{
	int rows;
	int cols;
	double* data;
};

struct matrix* create_matrix(int rows, int cols)
{
	struct matrix* m = malloc(sizeof(struct matrix));
	m->rows = rows;
	m->cols = cols;
	m->data = malloc(rows * cols * sizeof(*data));
	return m;
}

void destroy_matrix(struct matrix* m)
{
	free(m->data);
	free(m);
}

double matrix_get(struct matrix* m, int row, int col)
{
	return m->data[m->cols * row + col];
}

void matrix_set(struct matrix* m, int row, int col, double val)
{
	m->data[m->cols * row + col] = val;
}

struct matrix* multiply_matrix(struct matrix* m1, struct matrix* m2)
{
	struct matrix* result = create_matrix(....);
	...
	// умножаем -  берем ячейки из m1 и m2 с помощью matrix_get,
	// записываем рез-т в ячейки result с помощью matrix_set
	
	return result;
}

int main()
{
	struct matrix* m1 = create_matrix(....);
	struct matrix* m2 = create_matrix(....);
	struct matrix* res;

	// заполняем m1 и m2
	
	// перемножаем
	res = multiply_matrix(m1, m2);
	
	// читаем результат
	
	// удаляем объекты
	destroy_matrix(m1);
	destroy_matrix(m2);
	destroy_matrix(res);
	
}



Опционально, функции get/set можно объявить inline чтобы минимизировать оверхед от вызова функции при обращениях к ячейкам, как наиболее частой операции.
Но поскольку задача учебная в этой оптимизации нет смысла.
...
Рейтинг: 0 / 0
Умножение матриц
    #38674852
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо :)
Меня собственно интересовал вопрос с выделением памяти для массива внутри структуры.

Код: plaintext
1.
2.
3.
4.
5.
void destroy_matrix(struct matrix* m)
{
	free(m->data);
	free(m);
}



Странно, я думал что если освобождаю память для матрицы, то я освобождаю память для всех связанных с ней элементов.
...
Рейтинг: 0 / 0
Умножение матриц
    #38674857
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСтранно, я думал что если освобождаю память для матрицы, то я освобождаю память для всех связанных с ней элементов.
Нет. В С такое невозможно. Тут все ручками.
В С++ возможно при использовании классов (например контейнеров стандартной библиотеки).
...
Рейтинг: 0 / 0
Умножение матриц
    #38675209
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyОпционально, функции get/set можно объявить inline чтобы минимизировать оверхед от вызова функции при обращениях к ячейкам, как наиболее частой операцииАнатолий, а что, в С теперь и inline есть?
...
Рейтинг: 0 / 0
Умножение матриц
    #38675213
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСтранно, я думал что если освобождаю память для матрицы, то я освобождаю память для всех связанных с ней элементов.

Здесь, грубо говоря, такой принцип: на каждое выделение памяти, должно быть освобождение. Посмотри в create_matrix - malloc два раза вызывается.
...
Рейтинг: 0 / 0
Умножение матриц
    #38675449
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychАнатолий, а что, в С теперь и inline есть?
Начиная с C99 официально.
А GCC умел давно.
...
Рейтинг: 0 / 0
Умножение матриц
    #38675593
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyegorychАнатолий, а что, в С теперь и inline есть?
Начиная с C99 официально.
А GCC умел давно.ясно, спасибо, давно я не писал на чистом С, оказывается ))
...
Рейтинг: 0 / 0
Умножение матриц
    #38765262
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly Moskovsky, спасибо :)

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

В С ?
Как бы это супернаивно.
В С ничего не делается автоматом.
...
Рейтинг: 0 / 0
Умножение матриц
    #38765582
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это хорошо :)
...
Рейтинг: 0 / 0
Умножение матриц
    #38765846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не то слово.
...
Рейтинг: 0 / 0
12 сообщений из 62, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Умножение матриц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]