Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2017, 18:42   #11
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Код:
SL:=StrToInt(edt1.Text); // из edt1.Text принимает цифру
LastV:=Length(SloyVib[SL]); // присвоение текущего количества элементов в слое №SL
SetLength(SloyVib[SL],LastV+1);  //устан колич элементов на 1 больше чем было, было ноль, стло 1, был 1 стало 2 и тд при каждом вызове процедуры
LastV:=Length(SloyVib[SL]); снова присвоение переменной нового значения, что бы в ячейку под номерром LastV, запихать вектор
SloyVib[SL][LastV]:= BMtoVektor(img2.Picture.Bitmap);
я неправильно это делаю, а как надо?

я вот по такому же типу делал сеть, там все хорошо работает
тоесть также задвал размеры
Код:
procedure CreateSetb;  // Создает сеть.
var x,y,i,j,k:Integer;     // i - слой.  j - нейрон. x - веса нейрона.
begin
  Randomize;
  SetLength(Sloy,Length(PS)); // Устанавливаем колличество слоев.
  for i := 0 to Length(Sloy)-1 do begin // Перебераем слои.
    SetLength(Sloy[i],PS[i]);  // Устанавливаем колл нейрон в слое.
    for j := 0 to Length(Sloy[i])-1 do begin // Перебераем нейроны в слое
      if i=0 then begin  // Если слой входной то.
        SetLength(Sloy[i][j].W,900);//= колич. пикселей в Битмап
        SetLength(Sloy[i][j].X,900);//= колич. пикселей в Битмап
      end else begin
      //входов и весов последующих слоев = колличеству нейрон предыдущего слоя
        SetLength(Sloy[i][j].X,PS[i-1]);
        SetLength(Sloy[i][j].W,PS[i-1]);
        for x := 0 to Length(Sloy[i][j].X)-1 do begin//Перебераем веса нейрона.
        Sloy[i][j].W[x]:= (Random(200)-100)/200;
        end;
      end;
    end;
  end;
end;
Михаил22042016 вне форума Ответить с цитированием
Старый 25.01.2017, 23:02   #12
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

дело не в задании размеров, и не в их изменении.
Цитата:
LastV:=Length(SloyVib[SL]); снова присвоение переменной нового значения, что бы в ячейку под номером LastV, запихать вектор
а в том что в массиве SloyVib[SL] НЕТ и не может быть элемента с индексом Length(SloyVib[SL]) (это НОВОЕ значение переменной LastV).

раньше вы НЕ меняли и не использовали переменные с помощью которых устанавливали размеры массивов ПОСЛЕ установки этих самых размеров.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.01.2017, 04:10   #13
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
раньше вы НЕ меняли и не использовали переменные с помощью которых устанавливали размеры массивов ПОСЛЕ установки этих самых размеров.
тогда вот сделал так, тут я ничего не меняю

Код:
SetLength(SloyVib,33);
  for i := 0 to High(SloyVib) do begin
    SetLength(SloyVib[i],33);
    for j := 0 to High(SloyVib[i]) do begin   
       SetLength(SloyVib[i][j],900); <---- тут вылазит ошибка
    img2.Canvas.StretchDraw(Rect(0,0,30,30), img1.Picture.Bitmap); 
    SloyVib[i][j]:= BMtoVektor(img2.Picture.Bitmap);
 
    end;
  end;
феномен епрст
мб я как то не верно тип объявил, или не верно понимаю его структуру

TArrayOfreal = Array of real;
Vektor = TArrayOfreal; // 101101111101101
ArrVektor = array of Vektor; //массив векторов ArrVektor[j..n]=[[101101111101101],...,[101101111101101]]
TArrArrVektor = array of ArrVektor; //массив c массивами векторов TArrArrVektor[i..n][[101101111101101],...,[101101111101101]]

Последний раз редактировалось Михаил22042016; 26.01.2017 в 04:24.
Михаил22042016 вне форума Ответить с цитированием
Старый 26.01.2017, 04:58   #14
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

выходит что я не знаю как работает система типов и не врно понимаю структуру своего типа, либо феномен какойто, но
вот рабочий вариант, почему так работает, а в предыдущем варианте нет, ктонить может объяснить или сказать что почитать чтобы разобраться

Код:
procedure TForm1.btn3Click(Sender: TObject);
Type
  TArrayOfreal  =  Array of real;
  Vektor = Record
  X:TArrayOfreal;  // 101101111101101
  end;
  ArrVektor = array of Vektor;  //массив векторов  
  TArrArrVektor = array of ArrVektor;  //массив c массивами векторов TArrArrVektor[i..n][j..n].X

var
i,j,k : Integer; Vektor: TArrayOfreal;
NewV,SL,LastV: Integer;  // New адрес нового вектора, SL № слоя, LastV № последнего вектора в слое
begin
SetLength(SloyVib,33);
mmo1.Clear;
SetLength(SloyVib,33);
SL:= StrToInt(edt1.Text);
SetLength(SloyVib[SL],Length(SloyVib[SL])+1);  // количество векторов в слое выборки
img2.Canvas.StretchDraw(Rect(0,0,30,30), img1.Picture.Bitmap);
SloyVib[SL][Length(SloyVib)].X:= BMtoVektor(img2.Picture.Bitmap);
  for i := 0 to High(SloyVib) do begin     // слои
    mmo1.Lines.Add('i'+IntToStr(i)+' = '+IntToStr(Length(SloyVib[i]))) ;
  end;
end;
по нажатию на кнопку в нужный слой (номер SL) добавляет очередной элемент(вектор)





а как было бы правильно обявить тип
TArrayOfreal = Array of real;
Vektor = TArrayOfreal; // 101101111101101
ArrVektor = array of Vektor; //массив векторов ArrVektor[j..n]=[[101101111101101],...,[101101111101101]]
TArrArrVektor = array of ArrVektor; /

чтобы без Record обойтись

Vektor = Record
X:TArrayOfreal; // 101101111101101
end;
ArrVektor = array of Vektor; //массив векторов
TArrArrVektor = array of ArrVektor; //массив c массивами векторов

Последний раз редактировалось Михаил22042016; 26.01.2017 в 05:20.
Михаил22042016 вне форума Ответить с цитированием
Старый 26.01.2017, 07:10   #15
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Вопрос

феноменално
Код:
mmo1.Clear;
SetLength(SloyVib,4);
SL:=0+ StrToInt(edt1.Text);
SetLength(SloyVib[SL],Length(SloyVib[SL])+1);  // количество векторов в слое выборки
SetLength(SloyVib[SL][Length(SloyVib)].X,900);
img2.Canvas.StretchDraw(Rect(0,0,30,30), img1.Picture.Bitmap);
SloyVib[SL][Length(SloyVib)].X:= BMtoVektor(img2.Picture.Bitmap);
1. после работы кода, прогр закрывается с ошибкой, но может и без нее
2. ошибка вылазит когда хочет, тоесть код может сто раз подряд сработать, а на 101 АЦЕС ВИОЛАТИОН

короче говоря, оно так работать не будет?
к элементу массива можно добраться корректно только через цикл For?
но... даже в цикле For i = 0 to High(mfssiv) do
индекс i постоянно менятся

или мб, после внесений данных в массив, его уже нельзя менять по длинне?
ну тогда есть ли способ осуществить мою затею?
мне нужно сделать образци векторов для персептрона
думал делать так:

TArrayOfreal = Array of real;
Vektor = TArrayOfreal; // 101101111101101 сам вектор
ArrVektor = array of Vektor; //массив векторов, для каждой буквы например 100 векторов
TArrArrVektor = array of ArrVektor; // тут слои ArrVektor по сто штук например
как програмно добавлять новый эемент в массив чтобы его(массив) не сломать
начал искать сам, но не откажусь от подсказки

Последний раз редактировалось Михаил22042016; 26.01.2017 в 10:00. Причина: потеря надежды
Михаил22042016 вне форума Ответить с цитированием
Старый 26.01.2017, 10:03   #16
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

SloyVib[SL][Length(SloyVib)].X:= BMtoVektor(img2.Picture.Bitmap);

У вас массив SloyVib[SL] имеет ТОТ же размер что и SloyViob ?
Length(SloyVib) = Length(SloyVib[SL])

- нет они абсолютно разные.
- так какого ... в качестве индекса используется совсем не то что надо.

сходите по ссылке из #2(пост 2) и выполните рекомендацию.
"непонятная" AV превратится в RangeCheckError (т.е. использование НЕПРАВИЛЬНОГО индекса в массиве).
может тогда начнете проверять какой индекс и где НАДО использовать.

Цитата:
к элементу массива можно добраться корректно только через цикл For?
к элементу массива удобнее всего подбираться через его ИНДЕКС.
а вот ПЕРЕБИРАТЬ элементы массива удобнее всего в цикле for .
Цитата:
но... даже в цикле For i = 0 to High(mfssiv) do begin
индекс i постоянно менятся
а как вы хотите просмотреть ВСЕ элементы массива, только ПЕРЕБОРОМ всех ВОЗМОЖНЫХ индексов элементов.

Цитата:
или мб, после внесений данных в массив, его уже нельзя менять по длинне?
да ради бога меняйте, только НЕ используйте ПОТОМ индексов элементов ЗА пределами НОВЫХ границ.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.01.2017, 15:41   #17
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

победа вроде
добавление, на 5
визуализация на 5
000000000000000000000000000000
000000000000000011100000000000
000000000000011111111000000000
000000000001111111111000000000
000000000011111000011100000000
000000000111100000011110000000
000000001111000000001110000000
000000000110000000000110000000
000000001100000000000110000000
000000011100000000000110000000
000000011100000000000110000000
000000011100000000001110000000
000000111000000000000110000000
000000111000000000000110000000
000000111000000000000110000000
000000110000000000000110000000
000000110000000000000110000000
000010110100000000000110000000
000111111111111111111110000000
000111111111111101111110000000
000011000000000000000110000000
000011000000000000000110000000
000111000000000000000110000000
000111000000000000001111000000
000111000000000000001111000000
000111000000000000000110000000
000111000000000000001111000000
000000000000000000001111000000
000000000000000000001111000000
000000000000000000000111000000
000000000000000000111111100000
000000000000000001111111100000
000000000000000011110001110000
000000000000001111000001110000
000000000000011110000000110000
000000000000011100000000111000
000000000000011000000000111000
000000000000111000000000111000
000000000000111000000000111000
000000000000110000000000111000
000000000001100000000000111000
000000000001100000000000111000
000000000011100000000000111000
000000000011100000000000111000
000000000011000000000000111000
000000000111000000000000111000
000000000111000000000000111000
000000000111001111011111111000
000000001111111111111111111000
000000001111111111111111111000
000000011111000000000000110000
000000011110000000000000111000
000000011100000000000000111000
000000011100000000000000110000
000000011100000000000001110000
001111111000000000000001110000
001111111000000000000001110000
000111110000000000000001110000
000000000000000000000000100000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000111000000000000
000000000000001111110000000000
000000000000011111110000000000
000000000001111101110000000000
000000000011111000011000000000
000000000111100000111000000000
000000001111000000111000000000
000000011110000000011000000000
000000011100000000011000000000
000000011100000000011100000000
000000111100000000011100000000
000000111000000000011100000000
000000111000000000011100000000
000000111000000000011110000000
000001111000000000001100000000
000001110000000000001100000000
000011111110111111111110000000
000011111111111111111100000000
000011100110000100001110000000
000011100000000000001110000000
000011000000000000001111000000
000111000000000000000110000000
000111000000000000000110000000
001111000000000000000110000000
001110000000000000000110000000
001110000000000000000110000000
001100000000000000000110000000
000000000000000000000110000000
000000000000000000000000000000
000000000000000000000000000000
000000000000001111111000000000
000000000000011111111110000000
000000000000011110011110000000
000000000000111100001111000000
000000000000111000000111000000
000000000000111000000111000000
000000000000110000000011000000
000000000001100000000011100000
000000000011100000000011100000
000000000011000000000011100000
000000000111000000000011000000
000000000111000000000011000000
000000001110000000011111100000
000000001110000011111111100000
000000011100010111111111100000
000000011101111111000011100000
000000111111110000000011100000
000000111111100000000011100000
000000110000000000000011000000
000001110000000000000011000000
000011110000000000000011000000
000011100000000000000011000000
000111000000000000000011000000
000111000000000000000011000000
001110000000000000000011100000
001110000000000000000011100000
000000000000000000000011100000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000001110000000
000000000000000000001110000000
000000000000000000011101000000
000000000000000000011011100000
000000000000000000100011100000
000000000000000011100011100000
000000000000000111100001100000
000000000000000111000001110000
000000000000001110000001111000
000000000000011100000001111000
000000000000111000000000111000
000000000000100000000000011000
000000000001100000000000011000
000000000011000000000001111100
000000000110000000011111111100
000000011100000011111111111100
000000111011111111100000001100
000000110111111100000000001100
000001100111100000000000001100
000011000000000000000000001100
000010000000000000000000001100
000100000000000000000000001100
011100000000000000000000001110
111100000000000000000000001110
111100000000000000000000000111
111000000000000000000000000010
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000111111000000000000
000000000000111011000000000000
000000000000111001100000000000
000000000001111001100000000000
000000000001110000100000000000
000000000001110000110000000000
000000000001100000010000000000
000000000001000000011000000000
000000000011000000001100000000
000000000011000000000100000000
000000000011000000000011000000
000000000010000000000111100000
000000000110000000000011100000
000000001100000000000011111100
000000001100000000000011111110
000000011000000000011111111110
000000011001110111111111111000
000000111011111000000000011100
000000111111111000000000001100
000001110000000000000000001110
000001100000000000000000001110
000011100000000000000000000110
000011100000000000000000000011
000011100000000000000000000011
000011100000000000000000000001
000011100000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000011111000000000000
000000000000011111000000000000
000000000000011111000000000000
000000000000111111000000000000
000000000000111011000000000000
000000000001111001000000000000
000000000001110001100000000000
000000000001110001100000000000
000000000011100001110000000000
000000000011100001110000000000
000000000011100001111000000000
000000000111000000110000000000
000000001110000000010000000000
000000001110000000010000000000
000000011100000000011000000000
000000011000001111111000000000
000000110000011111111100000000
000000111000111111111100000000
000001110011111110000110000000
000001101111110000000110000000
000011001110000000000011000000
000011000000000000000001000000
000111000000000000000000100000
000110000000000000000000110000
001110000000000000000000111000
001100000000000000000000000000
011100000000000000000000000000
011100000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
Михаил22042016 вне форума Ответить с цитированием
Старый 26.01.2017, 15:43   #18
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

всем добра, здоровья и благопулучия

вот оно решение:
Код:
function ShowVektor :Boolean;
var
i,j,k,x : Integer; Vektor: TArrayOfreal;
SL : Integer;
txtv: TStringList;
begin
  x:=0;
  txtv:= TStringList.Create;
  Form1.mmo1.Clear;
  for i:=0 to Length(SloyVib)-1 do
    for j:=0 to  Length(SloyVib[i])-1 do
       for k:=0 to Length(SloyVib[i][j].X)-1 do begin
       Inc(x);
        if SloyVib[i][j].X[k]=0 then txtv.CommaText:=txtv.CommaText+('0');
        if SloyVib[i][j].X[k]<>0 then txtv.CommaText:=txtv.CommaText+('1');
//        TXT.CommaText:=TXT.CommaText+FloatToStr(SloyVib[i][j].X[k]);
        if x=30 then begin txtv.Text:=txtv.Text+#13#10;x:=0; end;
       end;
  Form1.mmo1.Text:=txtv.Text;
  FreeAndNil(txtv);
end;
Код:
function AddVektor :Boolean;
var
i : Integer; Vektor: TArrayOfreal;
SL : Integer;   // SL № слоя
txtv: TStringList;
begin
  txtv:= TStringList.Create;
  Form1.mmo1.Clear;
  SL:=0+ StrToInt(Form1.edt1.Text);
  SetLength(SloyVib[SL],Length(SloyVib[SL])+1);  // количество векторов в слое выборки
  SetLength(SloyVib[SL][Length(SloyVib[SL])-1].X,900);
  Form1.img2.Canvas.StretchDraw(Rect(0,0,30,30),Form1.img1.Picture.Bitmap);
  Vektor:= BMtoVektor(Form1.img2.Picture.Bitmap);
  SloyVib[SL][Length(SloyVib[SL])-1].X:= Vektor;
  for i := 0 to High(SloyVib) do begin     // слои
     txtv.Add('i'+IntToStr(i)+' = '+IntToStr(Length(SloyVib[i]))) ;
  end;
  Form1.mmo1.Text:=txtv.Text;
  FreeAndNil(txtv);
end;
Михаил22042016 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с массивом logo23 Паскаль, Turbo Pascal, PascalABC.NET 8 03.05.2012 21:42
Проблема с массивом... СтуденткаПитер Помощь студентам 3 09.06.2011 00:11
Проблема с квадратным массивом в Delphi. v0v41k Помощь студентам 2 19.12.2010 20:40
проблема с массивом kommunist Паскаль, Turbo Pascal, PascalABC.NET 7 27.05.2010 19:00
проблема с массивом kommunist Помощь студентам 6 14.11.2007 18:36