Страница 1 из 2

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

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

P.S. Сами понимаете, что мне сие - без нужды.))) Ho вот любимая племянница просила помочь...

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

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

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

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

Этого не может быть.

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

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

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

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

Добавлено: 08 июл 2008, 20:53
AV_77
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 перемножается строка первой на столбец второй.

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

Добавлено: 08 июл 2008, 21:39
Soul

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

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-х матриц - обычный пробег вложенными циклами.

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

Добавлено: 09 июл 2008, 00:11
Natrix
Soul писал(а):Source of the post

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

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

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

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

ЗЫ Если не нужно делать несколько экземпляров класса, то любой класс достаточно просто переписывается в модуль.

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

Добавлено: 09 июл 2008, 17:36
Natrix
И всё же?...
Соотношение между координатами, предположим, есть.
$$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, увы, нет ни сил, ни времени. Да и навыки решения подобных задач - не на уровне).

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

Добавлено: 10 июл 2008, 07:18
malk
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}}$$