Автор: Tribunal 13.03.2006 10:44
допустим,если использовать самый простой способ хранения разреженных матриц-
хранение значений, номера строк и столбцов в трёх одномерных массивах...
собственно,вопрос стоит в том,чтобы складывать и умножать две мптрицы,заданные таким образом.
для сложения вроде процедуру придумала...только вот она считает сумму элементов тогда,когда индексы не совпадают...
Код
var
i,j:integer;
begin
h:=1;
for i:=1 to k do
for j:=1 to c do
begin
if (ia[i]=ib[j]) and (ja[i]=jb[j])
then begin
cn[h]:=an[i]+bn[j];
ic[h]:=ia[i];
jc[h]:=ja[i];
h:=h+1;end
else begin
cn[h]:=an[i];
ic[h]:=ia[i];
jc[h]:=ja[i];
h:=h+1;
cn[h]:=bn[j];
ic[h]:=ib[j];
jc[h]:=jb[j];
h:=h+1;end;
end;
end;
здесь k,c кол-во полученных элементов в матрицах а и b соответственно.
для умножения не могу сообразить условие,по которому выполнялась бы эта операция...
не могли бы вы помочь мне в этих вопросах?
Автор: volvo 13.03.2006 13:29
Обязательно самопальные алгоритмы писАть? Чем готовые не устраивают?
http://alglib.sources.ru/sparse/
Автор: Tribunal 13.03.2006 15:31
Цитата(volvo @ 13.03.2006 16:29)
Обязательно самопальные алгоритмы писАть? Чем готовые не устраивают?
http://alglib.sources.ru/sparse/
не устраивают способом.
мне нужно перемножать и складывать матрицы,заданные совершенно
простым способом.
да и хотя бы просто интересно,почему не работает полученный мной алгоритм
Автор: volvo 13.03.2006 15:37
Цитата
мне нужно перемножать и складывать матрицы,заданные совершенно простым способом.
То-то я гляжу, у тебя самый простой способ, да не работает... Как всегда: "Лучше день потерять, потом за пять минут долететь"? (С) Ну, теряй, коли хочешь...
Цитата
почему не работает полученный мной алгоритм
Ты полностью программу приведи (вместе с ЗАПОЛНЕНИЕМ матрицы, и желательно с теми данными, на которых ты все это тестировала), а то придется все заново писать, чтобы проверить твои 20 строк, а кому это надо?
Автор: Tribunal 13.03.2006 16:47
в общем так,правда это на делфи
Код
type
savematr=array [1..100] of integer;
var
an,bn,cn,dn,ia,ib,ic,id,ja,jb,jc,jd:savematr;
k,c,m,n,h:integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
k:=k+1;
ia[k]:=StrToInt(Edit1.Text);
ja[k]:=StrToInt(Edit2.Text);
an[k]:=StrToInt(Edit3.Text);
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
c:=c+1;
ib[c]:=StrToInt(Edit4.Text);
jb[c]:=StrToInt(Edit5.Text);
bn[c]:=StrToInt(Edit6.Text);
Edit4.Clear;
Edit5.Clear;
Edit6.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
mia,mib,mja,mjb,i:integer;
begin
mia:=ia[1];
for i:=1 to k do
if ia[i]>mia then mia:=ia[i];
mja:=ja[1];
for i:=1 to k do
if ja[i]>mja then mja:=ja[i];
mib:=ib[1];
for i:=1 to c do
if ib[i]>mib then mib:=ib[i];
mjb:=jb[1];
for i:=1 to c do
if jb[i]>mjb then mjb:=jb[i];
if mia>mib then n:=mia else n:=mib;
if mja>mjb then m:=mja else m:=mjb;
Label21.Caption:=IntToStr(n);
Label22.Caption:=IntToStr(m);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
v,b,i,g:integer;
begin
v:=StrToInt(Edit7.Text);
b:=StrToInt(Edit8.Text);
for i:=1 to k do
if (ia[i]=v) and (ja[i]=b) then begin
Label11.Caption:=IntTostr(an[i]);
g:=1;end;
if g<>1 then Label11.Caption:=IntToStr(0);
end;
procedure TForm1.Button5Click(Sender: TObject);
var
v,b,i,g:integer;
begin
v:=StrToInt(Edit7.Text);
b:=StrToInt(Edit8.Text);
for i:=1 to c do
if (ib[i]=v) and (jb[i]=b) then begin
Label11.Caption:=IntTostr(bn[i]);
g:=1;end;
if g<>1 then Label11.Caption:=IntToStr(0);
end;
procedure TForm1.Button6Click(Sender: TObject);
var
i,j:integer;
begin
h:=1;
for i:=1 to k do
for j:=1 to c do
begin
if (ia[i]=ib[j]) and (ja[i]=jb[j])
then begin
cn[h]:=an[i]+bn[j];
ic[h]:=ia[i];
jc[h]:=ja[i];
h:=h+1;end
else begin
cn[h]:=an[i];
ic[h]:=ia[i];
jc[h]:=ja[i];
h:=h+1;
cn[h]:=bn[j];
ic[h]:=ib[j];
jc[h]:=jb[j];
h:=h+1;end;
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
v,b,i,g:integer;
begin
v:=StrToInt(Edit9.Text);
b:=StrToInt(Edit10.Text);
for i:=1 to h do
if (ic[i]=v) and (jc[i]=b) then begin
Label15.Caption:=IntTostr(cn[i]);
g:=1;end;
if g<>1 then Label15.Caption:=IntToStr(0);
end;
end.
ещё программу саму прилагаю.посмотрите,пожалуйста
Прикрепленные файлы
mein.rar ( 4.16 килобайт )
Кол-во скачиваний: 211
Автор: volvo 13.03.2006 17:11
Ну, и в каком порядке прикажешь на кнопки тыкать?
Неужели нельзя давать "говорящие" имена переменным и процедурам? "A", "C", "K", "CN" ну не говорят они ничего постороннему человеку !!! Чего куда вводить? Ты бы лучше сделала процедуру, в которую поступает разреженная матрица в общем виде, а на выходе - в твоем... А так - извини, но тыкать по кнопкам в надежде, что делаешь это правильно, НЕ ЗНАЯ (хотя я просил тебя привести) исходных данных - это пускай кто-нибудь другой делает...
P.S. Если это нужно тебе именно на Дельфи - я перенесу тему в соответствующий раздел...
Эскизы прикрепленных изображений