Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Операция над матрицей 
:(
    Опции темы
Digo
  Дата 6.1.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Доброго времени суток!
Есть функция(подключаю из модуля) по работе с матрицами(например транспонирование)
Код

Unit Matrix; 

interface 

type 
   MatrixPtr = ^MatrixRec; 
   MatrixRec = record 
     MatrixRow   : byte; 
     MatrixCol   : byte; 
     MatrixArray : pointer; 
   end; 
   MatrixElement = real; 
(* Функция транспонирует матрицу *) 
function TransponeMatrix(MPtr : MatrixPtr) : MatrixPtr; 

implementation 

function TransponeMatrix(MPtr : MatrixPtr) : MatrixPtr; 
var 
  TempPtr : MatrixPtr; 
  i,j     : byte; 
begin 
  if (MPtr <> nil) or (MPtr^.MatrixArray <> nil) then with MPtr^ do begin 
    TempPtr:= CreateMatrix(MatrixCol,MatrixRow); 
    for i:= 1 to MatrixRow do 
      for j:= 1 to MatrixCol do 
        SetMatrixElement(TempPtr,j,i,GetMatrixElement(MPtr,i,j)); 
    TransponeMatrix:= TempPtr; 
  end else TransponeMatrix:= nil; 
end; 


 и stringgrid1.Cells[i,j] где задается матрица с которой будем делать разные операции вопрос возможно очень дуратский.... как обработать грид с помощью этой функции(т.е. передать данные из таблицы в функцию) и вывести результат например в другой stringgrid... 
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 6.1.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 7
Всего: 89



Цитата(Digo @  6.1.2007,  21:33 Найти цитируемый пост)
как обработать грид с помощью этой функции(т.е. передать данные из таблицы в функцию) и вывести результат например в другой stringgrid

А в чем, собственно вопрос - как "подкрутить" функцию под работу с гридом или как в переменную матрицы забить значения грида?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Digo
Дата 7.1.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Помоему будет проще просто перекидывать данные из stringgrid в функцию(т.е. создавать матрицу и запихивать в нее данные из грида) далее расчитываем получаем уже транспонированную матрицу, проблема в том что не пойму как перенести содержимое гирда в функцию для расчета...
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 7.1.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 7
Всего: 89



Digo, недоконца ты привел исходны код.
Вот тебе пример:
Код

var i,j:word;
begin
for i to StringGrid1.rowcount do
for j to StringGrid1.ColCount do
a[i,j]:=StringGrid1.Cells[i,j];

Поможет?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
VICTAR
Дата 7.1.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 2
Всего: 80



а что такое a[i,j]? этот массив тоже ж надо объявить?

и 
Код

var a: array of array of real;
    i,j: word;
begin
SetLength(a,StringGrid1.ColCount);
for i:=0 to pred(StringGrid1.ColCount)
  do SetLength(a[i],StringGrid1.rowcount);

for j:=0 to pred(StringGrid1.rowcount) do
for i:=0 to pred(StringGrid1.ColCount) do
a[i,j]:=StrToFloat(StringGrid1.Cells[i,j]);




Это сообщение отредактировал(а) VICTAR - 7.1.2007, 13:53
PM MAIL   Вверх
Digo
Дата 7.1.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Собственно модуль довольно извесный весь его код тут(я привел только 1 функцию чтобы не загромождать всеsmilehttp://www.megalib.com/books/478/1584.htm
То что вы описали это понятно - перевод в масив из гирда... мне интересно как это все запихать в функцию вызываемую из того модуля что я привел, ну например matirx.TransponeMatrix(????); нужно соответствие типов, там вообще все через record сделано...

--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 7.1.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 7
Всего: 89



Цитата(Digo @  7.1.2007,  15:41 Найти цитируемый пост)
там вообще все через record сделано...

Ну тогда записывай и грида в рекорд. В чем проблеммы?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Digo
Дата 7.1.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



проблема как раз в том что плохо себе представляю как это сделать smile 
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
VICTAR
Дата 7.1.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 2
Всего: 80



Код

procedure TForm1.Button1Click(Sender: TObject);
var i,j: word;
    mtr,mtr2: MatrixPtr;
begin
mtr:=CreateMatrix(StringGrid1.rowcount,StringGrid1.ColCount);

for j:=0 to pred(StringGrid1.rowcount) do
  for i:=0 to pred(StringGrid1.ColCount) do
    SetMatrixElement(mtr,j+1,i+1,StrToFloat(StringGrid1.Cells[i,j]));

mtr2:=TransponeMatrix(mtr);
StringGrid2.RowCount:=mtr2.MatrixRow;
StringGrid2.ColCount:=mtr2.MatrixCol;

for j:=0 to pred(StringGrid2.rowcount) do
  for i:=0 to pred(StringGrid2.ColCount) do
    StringGrid2.Cells[i,j]:=FloatToStr(GetMatrixElement(mtr2,j+1,i+1));

DeleteMatrix(mtr);
DeleteMatrix(mtr2);
end;


Это сообщение отредактировал(а) VICTAR - 7.1.2007, 16:33
PM MAIL   Вверх
Guedda
Дата 7.1.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 6
Всего: 78



Я считаю, что просто необходимо переделать структуру record, и переписать функцию под StringGrid.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
VICTAR
Дата 7.1.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 2
Всего: 80



Да вроде и так все удобно... ИМХО хороший модуль
PM MAIL   Вверх
Digo
Дата 7.1.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Спасибо VICTAR,  за пример, работает все! А модуль действительно хороший,  почти все операции стандартные с матрицами есть...
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Digo
Дата 8.1.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Сейчас копнул глубже столкнулся с проблемой:
функция обращения матрицы не желает работать  ReverseMatrix(MPtr : MatrixPtr) : MatrixPtr; 
в приведенном выше коде ошибка выскакивает на 12 строке (StringGrid2.RowCount:=mtr2.MatrixRow;) то же самое и с умножением матрицы на матрицу... Пишет Access Volation at address...
хотя умножение на число и транспонирование работают

--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
VICTAR
Дата 8.1.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 2
Всего: 80



Да, ты прав. Похоже проблема в самом модуле. Поэтому надо его как следует поизучать.
ЗЫ я нашел еще один похожий модуль, но я его пока еще не смотрел здесь

PM MAIL   Вверх
Digo
Дата 9.1.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 30.9.2004
Где: Ростов на Дону

Репутация: нет
Всего: нет



Там все куда более наворочено(в приведенном новом модуле), а ошибка выскакивает уже в новой матрице которя расчитывается, кстати заметил определитель тоже не считает всегда 0...
--------------------
640кб оперативной памяти хватит миру по самые уши (Билл Гейтс )
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.