Страница 1 из 2
Алгоритм надобен, a точнее - хорошие мозги)))
Добавлено: 08 июл 2008, 16:11
Natrix
Треугольные правые матрицы A и B, размерности
представлены в виде одномерных массивов размерностью
, то есть без нулей под главной диагональю.
Требуется: Получить в таком же виде 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
Эм, может я совсем уже забыл, как перемножаются матрицы, но у меня вышло (при возведении предыдущей матрицы в квадрат):
Мы ведь перемножаем столбец первой на строку втооой...?
Алгоритм надобен, a точнее - хорошие мозги)))
Добавлено: 08 июл 2008, 20:53
AV_77
Soul писал(а):Source of the post Эм, может я совсем уже забыл, как перемножаются матрицы, но у меня вышло (при возведении предыдущей матрицы в квадрат):
Мы ведь перемножаем столбец первой на строку втооой...?
Просто матрица
не треугольная. Доджно быть
:
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
И всё же?...
Соотношение между координатами, предположим, есть.
A что дальше?
Когда мы перемножаем матрицы "как матрицы" - есть четкий алгоритм получения каждого элемента:
A тут как быть?
P.S. (Скажу честно, если бы не огромные кипы бумаг, которые каждый день ждут меня на работе, я бы поломал голову над этой задачей. Ho, увы, нет ни сил, ни времени. Да и навыки решения подобных задач - не на уровне).
Алгоритм надобен, a точнее - хорошие мозги)))
Добавлено: 10 июл 2008, 07:18
malk
Может чего-то не понял, но в данном случае все просто: