Программа для работы с многомерными динамическими массивами

19.12.2010
4
0
#1
Задача состоит в следующем: необходимо написать программу, которая могла бы создавать n-мерное количество m-мерных массивов. Предусмотреть формирование массива вручную и автоматически, при формировании автоматически заполнение должно производиться с использованием трех и более законов распределения. Предусмотреть вывод в графическом режиме, если заполнение производиться числами. Кроме того нужно выполнить элементарные действия с массивами, но это я думаю и сам смогу реализовать :unsure:

Вопрос: возникла следующая проблема при попытке вычислить и заполнить StringGrid по формуле экспоненциального распределения. Функции я создаю в отдельном модуле. Во-первых, я не уверен, правильно ли я написал формулу на Делфи:


Код:
unit Mas_func; 

interface 

Type mas = array of array of single; 

procedure ExponInit(n,m: integer; p: single; var a: mas); 

implementation 

procedure ExponInit(n,m: integer; p: single; var a: mas); 
var i,j: integer; 
begin 
SetLength(a, n, m); 
a[0, 0] := 1; 
for i := 0 to n-1 do 
for j := 0 to m-1 do 
a[i, j] := p * exp((-p) * a[i, j]); 
end; 

end.
Далее идет модуль с прогой, где я не уверен в правильной передаче содержимого массива в StringGrid, а не уверен, поскольку мне не нравятся значения которые появляются в StringGrid:

Код:
implementation 

{$R *.dfm} 

var a1: mas; n,m: integer; p: single; 

procedure TForm1.RadioGroup1Click(Sender: TObject); 
var i,j: integer; 
s: string; 
begin 
n := SpinEdit1.Value; 
m := SpinEdit2.Value; 
p := StrToFloat(Edit1.Text); 
StringGrid1.RowCount := n; 
StringGrid1.ColCount := m; 

with StringGrid1 do 
for i := 0 to RowCount - 1 do 
for j := 0 to ColCount - 1 do 
Cells[j, i]:= ''; 

if (RadioGroup1.ItemIndex = 0) then begin 
ExponInit(n,m,p,a1); 
for i := 0 to n-1 do 
for j := 0 to m-1 do begin 
str(a1[i, j]:8:3, s); 
StringGrid1.Cells[j, i] := s; 
end; 
end; 

end; 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
if (Key in ['.', 'a'..'z', 'A'..'Z']) then 
ShowMessage('Ви ввели недопустимий символ!'); 
end; 

end.
Помогите пожалуйста разобраться, спасибо.
 
19.12.2010
4
0
#3
Хорошо, я понял. Сделал так, посмотрите, вроде бы работает, знать бы правильно ли?

Код:
unit Mas_func;

interface

Type TMyArray = array of array of single;

procedure ExponInit(n,m: integer; p: single; var a: TMyArray);

implementation

uses Math;

procedure ExponInit(n,m: integer; p: single; var a: TMyArray);
var i,j: integer;
begin
SetLength(a, n, m);
Randomize;

for i := 0 to n-1 do
for j := 0 to m-1 do
a[i, j] := Random(5)-5;

for i := 0 to n-1 do
for j := 0 to m-1 do
a[i, j] := p * exp(-p * a[i, j]);
end;

end.
Главный модуль:

Код:
implementation

{$R *.dfm}

var a: TMyArray; n,m: integer; p: single;

procedure TForm1.Button1Click(Sender: TObject);
begin
SpinEdit1.Value
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
var i,j: integer;
s: string;
begin
n := SpinEdit1.Value;
m := SpinEdit2.Value;
p := StrToFloat(Edit1.Text);
StringGrid1.RowCount := n;
StringGrid1.ColCount := m;

with StringGrid1 do
for i := 0 to RowCount - 1 do
for j := 0 to ColCount - 1 do
Cells[j, i]:= '';

if (RadioGroup1.ItemIndex = 0) then begin
ExponInit(n,m,p,a);
for i := 0 to n-1 do
for j := 0 to m-1 do begin
str(a[i, j]:8:3, s);
StringGrid1.Cells[j, i] := s;
end;
end;

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (Key in ['.','a'..'z','A'..'Z','+','-','*','/','\','=','_','|']) then
Key := #0;
end;

end.
 

nayke

Well-Known Member
04.08.2010
310
0
#4
a[i, j] := Random(5)-5;

a[i, j] := p * exp(-p * a[i, j]);
Мне все-таки кажется что случайное вычисление x не подходит для создания экспоненциального распределения в массиве. вместо х надо брать j, а случайным образом определять p
я бы сделал так:
p := Random(сколько необходимо)+1;

a[i, j] := p * exp(-p * j);
тогда для каждого вектора получится случайное, но экспоненциальное распределение.
 
19.12.2010
4
0
#5
Так мне нужен один график для одной матрицы, зачем мне больше одного p для одной матрицы. p - это параметр масштаба. И почему j, а не i, это по ходу дела не имеет значения, поскольку все массивы должны быть квадратными, так как мне нужно выполнять над ними элементарные операции и соответственно они не могут быть прямоугольными. Я честно говоря, не знаю, как правильно подойти к этой задаче, с какой стороны не подойду, все не правильно.
 

nayke

Well-Known Member
04.08.2010
310
0
#6
Так мне нужен один график для одной матрицы, зачем мне больше одного p для одной матрицы. p - это параметр масштаба. И почему j, а не i, это по ходу дела не имеет значения, поскольку все массивы должны быть квадратными, так как мне нужно выполнять над ними элементарные операции и соответственно они не могут быть прямоугольными. Я честно говоря, не знаю, как правильно подойти к этой задаче, с какой стороны не подойду, все не правильно.
если в качестве х выступает j - вы получите все строки одинаковые, i - все столбцы. Применяя j в каждой строке вы получите экспоненту, а изменяя p распределение в каждой строке будет экспонентой но разной.. вот что я хотел сказать. А получая х случайно в строках распределение экспонентой не будет.
 
19.12.2010
4
0
#7
Я Вас понимаю, но посмотрите на формулу, там стоит х, кто в таком случае не прав и что делать?