Умножение матрицы на вектор в Delphi
Добавлено: 08 дек 2005, 09:34
В программе имеется процедура для умножения прямоугольной матрицы на вектор. Ввод данных осуществляется с использованием StringGrid.
При установке колонок больше чем строк появляется Invalid floating point, а при установке строк больше чем колонок Access violation at address.....
Ошибка возникает в цикле при умножении Matrix на Vector.
Код: Выделить всё
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.

Ошибка возникает в цикле при умножении Matrix на Vector.