Алгоритм надобен, a точнее - хорошие мозги)))

Natrix
Сообщений: 1419
Зарегистрирован: 15 ноя 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Natrix » 08 июл 2008, 16:11

Треугольные правые матрицы A и B, размерности $$ n*n $$ представлены в виде одномерных массивов размерностью $$ \frac{n(n+1)}{2} $$, то есть без нулей под главной диагональю.
Требуется: Получить в таком же виде AB, не меняя представления матриц.

P.S. Сами понимаете, что мне сие - без нужды.))) Ho вот любимая племянница просила помочь...
Последний раз редактировалось Natrix 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Soul
Сообщений: 2475
Зарегистрирован: 09 апр 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Soul » 08 июл 2008, 19:17

Natrix, a как быть c тем, что результирующая матрица не будет иметь вид, как две исходные? T.e. там будет больше, чем N*(N+1)/2 ненулевых эелементов
Последний раз редактировалось Soul 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

AV_77
Сообщений: 3530
Зарегистрирован: 23 фев 2007, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение AV_77 » 08 июл 2008, 19:35

Soul писал(а):Source of the post
Natrix, a как быть c тем, что результирующая матрица не будет иметь вид, как две исходные? T.e. там будет больше, чем N*(N+1)/2 ненулевых эелементов

Этого не может быть.
Последний раз редактировалось AV_77 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Soul
Сообщений: 2475
Зарегистрирован: 09 апр 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Soul » 08 июл 2008, 20:28

$$\(\begin{array}{cc)}\\1 & 1 \\1&0 \end{array}\)$$
Эм, может я совсем уже забыл, как перемножаются матрицы, но у меня вышло (при возведении предыдущей матрицы в квадрат):
$$\(\begin{array}{cc)}\\2 & 1 \\2&1 \end{array}\)$$

Мы ведь перемножаем столбец первой на строку втооой...?
Последний раз редактировалось Soul 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

AV_77
Сообщений: 3530
Зарегистрирован: 23 фев 2007, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение AV_77 » 08 июл 2008, 20:53

Soul писал(а):Source of the post
$$\(\begin{array}{cc)}\\1 & 1 \\1&0 \end{array}\)$$
Эм, может я совсем уже забыл, как перемножаются матрицы, но у меня вышло (при возведении предыдущей матрицы в квадрат):
$$\(\begin{array}{cc)}\\2 & 1 \\2&1 \end{array}\)$$

Мы ведь перемножаем столбец первой на строку втооой...?


Просто матрица $$\(\begin{array}{cc)}\\1 & 1 \\1&0 \end{array}\)$$ не треугольная. Доджно быть $$\(\begin{array}{cc)}\\1 & 1 \\0&1 \end{array}\)$$:
$$\(\begin{array}{cc)}\\1 & 1 \\0&1 \end{array}\)^2 = \(\begin{array}{cc)}\\1 & 2 \\0&1 \end{array}\) $$
A перемножается строка первой на столбец второй.
Последний раз редактировалось AV_77 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Soul
Сообщений: 2475
Зарегистрирован: 09 апр 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Soul » 08 июл 2008, 21:39

Код: Выбрать все

type
TMatrix = class
 private
 elems : array of integer;
 cnt, n : word;

 public
 constructor create(const n : word);
 destructor destroy;override;
 procedure set(x,y : word; val : integer);
 function get(x,y; word) : integer;
end;

constructor TMatrix.create(const n : word);
begin
 cnt:=n*n;
 self.n:=n;
 setlength(elems,cnt);
end;

destructor TMatrix.destroy;
begin
 cnt:=0;
 setlength(elems,cnt);
end;

procedure TMatrix.set(x,y : word; val : integer);
var before, m : word;
begin
 if (y>x)or(x>n)or(y>n) then exit;

before:=0;
if y>0 then before:=(n+(n-y+1))*y div 2;
m:=before+x-y;

elems[m]:=val;
end;

function TMatrix.get(x,y; word) : integer;
var before, m : word;
begin
 if (y>x)or(x>n)or(y>n) then
 begin
 result:=0;
 exit;
 end;

before:=0;
if y>0 then before:=(n+(n-y+1))*y div 2;
m:=before+x-y;

result:=elems[m];
end;


Честно скажу, на компиляторе пока код не проверял. Ho идея примерно такая. Дальше умножение 2-х матриц - обычный пробег вложенными циклами.
Последний раз редактировалось Soul 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

Natrix
Сообщений: 1419
Зарегистрирован: 15 ноя 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Natrix » 09 июл 2008, 00:11

Soul писал(а):Source of the post

Честно скажу, на компиляторе пока код не проверял. Ho идея примерно такая. Дальше умножение 2-х матриц - обычный пробег вложенными циклами.

Дабы избежать оверквотинга, код я "застрелил".
Задача предложена в курсе самостоятельного изучения Паскаля (в версии Турбо за номером 7).
Иными словами, ни o каких классах речи не идет. Мне, собственно, даже код не нужен - важен алгоритм получения произведения матриц, заданных столь извращенным способом.
Последний раз редактировалось Natrix 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Soul
Сообщений: 2475
Зарегистрирован: 09 апр 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Soul » 09 июл 2008, 00:34

Ну так, вроде, самое сложное в столь извращенном способе задания матриц - найти соответствие между двумерными координатами квадратной матрицы и одномерной координатой элемента массива. Эта часть, вроде, неплохо видна в примере.

ЗЫ Если не нужно делать несколько экземпляров класса, то любой класс достаточно просто переписывается в модуль.
Последний раз редактировалось Soul 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

Natrix
Сообщений: 1419
Зарегистрирован: 15 ноя 2006, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение Natrix » 09 июл 2008, 17:36

И всё же?...
Соотношение между координатами, предположим, есть.
$$m=(i-1)n+j-\frac{i(i-1)}{2}$$
A что дальше?
Когда мы перемножаем матрицы "как матрицы" - есть четкий алгоритм получения каждого элемента:
$$c_{ij}=\sum_{k=1}^{n}{a_{ik}b_{kj}}$$
A тут как быть?

P.S. (Скажу честно, если бы не огромные кипы бумаг, которые каждый день ждут меня на работе, я бы поломал голову над этой задачей. Ho, увы, нет ни сил, ни времени. Да и навыки решения подобных задач - не на уровне).
Последний раз редактировалось Natrix 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test

malk
Сообщений: 281
Зарегистрирован: 03 дек 2007, 21:00

Алгоритм надобен, a точнее - хорошие мозги)))

Сообщение malk » 10 июл 2008, 07:18

Natrix писал(а):Source of the post
Соотношение между координатами, предположим, есть.
$$m=(i-1)n+j-\frac{i(i-1)}{2}$$
$$c_{ij}=\sum_{k=1}^{n}{a_{ik}b_{kj}}$$
A тут как быть?


Может чего-то не понял, но в данном случае все просто:
$$c_{ij}=\sum_{k=i}^{j}{a_{ik}b_{kj}}$$
Последний раз редактировалось malk 30 ноя 2019, 12:21, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

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