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

Умножение матрицы на вектор в Delphi

Добавлено: 08 дек 2005, 09:34
Svet_lana
В программе имеется процедура для умножения прямоугольной матрицы на вектор. Ввод данных осуществляется с использованием StringGrid.

Код: Выделить всё

unit Work5555;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
StringGrid2: TStringGrid;
Label5: TLabel;
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type Ardex= array of array of Extended;
var
Form1: TForm1;
i,j:Integer;
Matrix1, Vector1: ardex;

implementation

{$R *.dfm}
[b]procedure Umnoz [/b](const Matrix:ardex; const Vector:ardex; col:Integer; row:Integer; out s:string);
var i1,j1:Integer; Prom:Extended;
begin
s:= ' ';
for i1:=0 to col-1 do
begin
Prom:=0;
for j1:=0 to row-1 do Prom:= Prom + (Matrix[i1,j1])* (Vector[j1,0]);
s:=s+FloatToStr(Prom)+ ' ';
end;
[b]end;[/b]
procedure TForm1.Edit1Change(Sender: TObject);
Var i1,kod: Integer;
begin
Val(Edit1.Text,i1,kod); If (kod = 0) and (i1 > 0) then
begin
Label4.Caption:='';
StringGrid1.ColCount := i1;
StringGrid2.RowCount := i1;
end
else Label4.Caption := 'Число не верно';
end;
procedure TForm1.Edit2Change(Sender: TObject);
Var i1,kod: Integer;
begin
Val(Edit2.Text,i1,kod); If (kod = 0) and (i1 > 0) then
begin
Label4.Caption:='';
StringGrid1.RowCount := i1;
end
else Label4.Caption := 'Число не верно';
end;

procedure TForm1.Button1Click(Sender: TObject);
var s1: String;
begin
s1:=' ';
Setlength(Matrix1,Stringgrid1.RowCount, Stringgrid1.ColCount);
Setlength(Vector1, StringGrid2.RowCount,1);
For i:=0 to StringGrid1.colcount-1 do
For j:=0 to StringGrid1.rowcount-1 do
Matrix1 [j,i]:= StrToFloat (StringGrid1.Cells[i,j]);
For i:=0 to StringGrid2.rowcount-1 do
Vector1 [i,0]:= StrToFloat (StringGrid2.Cells[0,i]);
Umnoz (Matrix1, Vector1, StringGrid1.ColCount, Stringgrid1.RowCount, s1);
Label5.Caption :=s1;
end;
end.
При установке колонок больше чем строк появляется Invalid floating point, а при установке строк больше чем колонок Access violation at address..... :(
Ошибка возникает в цикле при умножении Matrix на Vector.

Добавлено: 12 дек 2005, 14:42
Eugie
Лень разбираться, но скорее всего строки и столбцы перепутаны

Добавлено: 14 дек 2005, 16:37
Svet_lana
Я уже решила Ответ такой

unit Work5555;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
StringGrid2: TStringGrid;
Label5: TLabel;
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type Ardex= array of array of Extended;
var
Form1: TForm1;
i,j:Integer;
Matrix1, Vector1: ardex;

implementation

{$R *.dfm}
procedure Umnoz (const Matrix:ardex; const Vector:ardex; col:Integer; row:Integer; out s:string);
var i1,j1:Integer; Prom:Extended;
begin
s:= ' ';
for j1:=0 to row-1 do
begin
Prom:=0;
for i1:=0 to col-1 do Prom:= Prom + (Matrix[i1,j1])* (Vector[0,i1]);
s:=s+FloatToStr(Prom)+ ' ';
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
Var i1,kod: Integer;
begin
Val(Edit1.Text,i1,kod); If (kod = 0) and (i1 > 0) then
begin
Label4.Caption:='';
StringGrid1.ColCount := i1;
StringGrid2.RowCount := i1;
end
else Label4.Caption := 'Число не верно';
end;

procedure TForm1.Edit2Change(Sender: TObject);
Var i1,kod: Integer;
begin
Val(Edit2.Text,i1,kod); If (kod = 0) and (i1 > 0) then
begin
Label4.Caption:='';
StringGrid1.RowCount := i1;
end
else Label4.Caption := 'Число не верно';
end;

procedure TForm1.Button1Click(Sender: TObject);
var s1: String; Prov:Extended; kod:Integer;
begin
s1:=' ';
Setlength(Matrix1,Stringgrid1.ColCount, Stringgrid1.RowCount);
Setlength(Vector1,1, Stringgrid1.ColCount);
For i:=0 to StringGrid1.colcount-1 do
For j:=0 to StringGrid1.rowcount-1 do
begin
val(StringGrid1.Cells[i,j], Prov,kod);
if kod=0 then Matrix1 [i,j]:= StrToFloat (StringGrid1.Cells[i,j])
else
begin
ShowMessage ('Число не верно, введите другое');
exit;
end;
end;
For j:=0 to StringGrid2.rowcount-1 do
begin
val(StringGrid2.Cells[0,j], Prov,kod);
if kod=0 then Vector1 [0,j]:= StrToFloat (StringGrid2.Cells[0,j])
else
begin
ShowMessage ('Число не верно, введите другое');
exit;
end;
end;
Umnoz (Matrix1, Vector1, StringGrid1.ColCount, Stringgrid1.RowCount, s1);
Label5.Caption :=s1;
end;
end.

Добавлено: 14 дек 2005, 17:12
Игорь Акопян
Svet_lana, на будущее используйте тег Code чтобы вставленный фрагмент сохранял отступы, читать это невозможно :(

Добавлено: 15 дек 2005, 00:07
Duncon
Да с формированием кода действительно проблемы,, найдите как правильно, точнее о формировании, все пора заканчивать с бухлом, вобщем правила правописания в Delphi,
:) ,пивная пауза, :)
вот ссылка на первоисточник
http://community.borland.com/soapbox/te ... 80,00.html
а перед этим почитайте статью моего брата по разуму о культуре программирования
http://www.glscene.ru/content.php?article.41

ps Да и вообще всем кто не вкурсе как писать читаемый код -- читать это!!!

Добавлено: 15 дек 2005, 01:29
AiK
Duncon, флейм однако. Твоему же братцу или тому, кто HTML верстал следует узнать о наличии тэга PRE, а так же задуматься о необходимости полей для удобства чтения :D

Добавлено: 15 дек 2005, 12:21
Duncon
AiK Этот сайт не по до мной(я эту проблему давно на подобной системе решил)
Дело в том что статьи там может выкладывать любой юзер, и их обрабатывает движок у которого как раз проблемы.

Ладно извиняюсь за флейм.. Но все равно это должен знать каждый.