刚才的一位仁兄给出了最小二乘算法,如下:
procedure MinSqrMul(m, n: Integer; A: TMatrix; b: array of Double; var x: array of Double);
var
i, j, k: Integer;
ATA: array of array of Double;
ATb: array of Double;
Elem: Double;
begin
SetLength(ATA, n, n);
SetLength(ATb, n);
for i := 0 to n - 1 do
for j := 0 to n - 1 do begin
ATA[i, j] := 0;
for k := 0 to m - 1 do
ATA[i, j] := ATA[i, j] + A[k, i] * A[k, j];
end;
for i := 0 to n - 1 do begin
ATb[i] := 0;
for j := 0 to m - 1 do
ATb[i] := ATb[i] + A[j, i] * b[j];
end;
for i := 0 to n - 1 do begin
Elem := ATA[i, i];
for j := i to n - 1 do
ATA[i, j] := ATA[i, j] / Elem;
ATb[i] := ATb[i] / Elem;
for k := i + 1 to n - 1 do begin
Elem := -ATA[k, i];
for j := [red]i + 1[/red] to n - 1 do
ATA[k, j] := ATA[k, j] + ATA[i, j] * Elem;
ATb[k] := ATb[k] + ATb[i] * Elem;
end;
end;
x[n - 1] := ATb[n - 1];
for i := n - 2 downto 0 do begin
for j := i + 1 to n - 1 do
ATb[i] := ATb[i] - ATA[i, j] * x[j];
x[i] := ATb[i];
end;
end;
以下是调用
procedure TForm1.FormClick(Sender: TObject);
var
A: TMatrix;
//系统提示[Error] UnitPump.pas(67): Undeclared identifier: 'TMatrix'
b: array [0..2] of Double;
x: array [0..1] of Double;
begin
SetLength(A, 3, 2);
A[0, 0] := 1; A[0, 1] := 2; b[0] := 3;
A[1, 0] := 1; A[1, 1] := 2; b[1] := 4;
A[2, 0] := 2; A[2, 1] := 1; b[2] := 3;
MinSqrMul(3, 2, A, b, x);
ShowMessage(Format('%f, %f', [x[0], x[1]]));
end; 问题是,里面的TMatrix在哪里定义呀?
procedure MinSqrMul(m, n: Integer; A: TMatrix; b: array of Double; var x: array of Double);
var
i, j, k: Integer;
ATA: array of array of Double;
ATb: array of Double;
Elem: Double;
begin
SetLength(ATA, n, n);
SetLength(ATb, n);
for i := 0 to n - 1 do
for j := 0 to n - 1 do begin
ATA[i, j] := 0;
for k := 0 to m - 1 do
ATA[i, j] := ATA[i, j] + A[k, i] * A[k, j];
end;
for i := 0 to n - 1 do begin
ATb[i] := 0;
for j := 0 to m - 1 do
ATb[i] := ATb[i] + A[j, i] * b[j];
end;
for i := 0 to n - 1 do begin
Elem := ATA[i, i];
for j := i to n - 1 do
ATA[i, j] := ATA[i, j] / Elem;
ATb[i] := ATb[i] / Elem;
for k := i + 1 to n - 1 do begin
Elem := -ATA[k, i];
for j := [red]i + 1[/red] to n - 1 do
ATA[k, j] := ATA[k, j] + ATA[i, j] * Elem;
ATb[k] := ATb[k] + ATb[i] * Elem;
end;
end;
x[n - 1] := ATb[n - 1];
for i := n - 2 downto 0 do begin
for j := i + 1 to n - 1 do
ATb[i] := ATb[i] - ATA[i, j] * x[j];
x[i] := ATb[i];
end;
end;
以下是调用
procedure TForm1.FormClick(Sender: TObject);
var
A: TMatrix;
//系统提示[Error] UnitPump.pas(67): Undeclared identifier: 'TMatrix'
b: array [0..2] of Double;
x: array [0..1] of Double;
begin
SetLength(A, 3, 2);
A[0, 0] := 1; A[0, 1] := 2; b[0] := 3;
A[1, 0] := 1; A[1, 1] := 2; b[1] := 4;
A[2, 0] := 2; A[2, 1] := 1; b[2] := 3;
MinSqrMul(3, 2, A, b, x);
ShowMessage(Format('%f, %f', [x[0], x[1]]));
end; 问题是,里面的TMatrix在哪里定义呀?
解决方案 »
- TBitmap在线程中绘制有问题?
- 这是什么编码啊 %D6%D0%B9%FA
- 怎样从网上每天定时取新闻放到本地?
- 下面是一段读取数据库的代码,读出来的结果根我想的不一样,这是为什么呢???
- EXE调用BPL包,怎样跟踪调试BPL里的文件代码,急~~~
- Windows的控制交点是如何判断的?
- 桌面的弹出菜单的“刷新”是发送什么消息?
- 如何得到窗体中当前获得焦点的控件呢?还想问一下关于DBGRID的一个问题。
- delphi连接oracle数据库为什么连不了.
- 简单问题[2]:接上:为什么我在listbox里面只能一次增加一个文件名阿
- 请问大家有没有带阴历的日期控件呀?
- 删除,修改字段名的Sql语句分别是什么
TMatrix:array of array of real;谢谢了!