• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Builder 6 - macierz odwrotna

VPS Starter Arubacloud
+3 głosów
2,417 wizyt
pytanie zadane 7 kwietnia 2015 w C i C++ przez Piotr Skóra Użytkownik (680 p.)
otagowane ponownie 11 kwietnia 2015 przez Piotr Skóra
Witam

Czy znacie sposób jak w builderze policzyć macierz odwrotną? Mogą to być bbiblioteki, byle by działały z tym środowiskiem. Szukałem na forach, trafiałem na "boosty", "cml" i inne ale nie udało mi się uruchomić ich z builderem.
Macierz ma rozmiar 8x8 i nie potrafie zakodować tego samodzielnie :/

Pozdrawiam

5 odpowiedzi

+2 głosów
odpowiedź 8 kwietnia 2015 przez iwan9449 Pasjonat (20,810 p.)
Niestety nie znam biblioteki, która mogłaby rozwiązać ten problem, ale wydaje mi się, że można to rozwiązać metodą odwracania macierzy przy pomocy wyznaczników i z urzyciem rekurencji :) Jutro będę miał więcej czasu to pomyslę nad tym :)
pytanie zadane 11 kwietnia 2015 w C i C++ przez Piotr Skóra Użytkownik (680 p.) Czemu Borland C++ ma problem z dzieleniem przez zero a Visual Studio nie?
+1 głos
odpowiedź 7 kwietnia 2015 przez DarkEliat Bywalec (2,810 p.)
Wiem, że to ja miałem tobie pomóc, ale czym jest odwrotna macierz ?
komentarz 7 kwietnia 2015 przez Ukis Gaduła (4,580 p.)
komentarz 7 kwietnia 2015 przez Wirus Stary wyjadacz (13,980 p.)
:P nick jest - wiedza chyba nie xD
komentarz 7 kwietnia 2015 przez DarkEliat Bywalec (2,810 p.)
I tak nic z tego nie rozumiem. Poza tym fajna stronka.
komentarz 8 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)

Macierz A podniesiona do potęgi -1 :P 
Są różne sposoby żeby ją wyznaczyć
Dla przykłądu macierz i jej macierz odwrotna
A=\begin{bmatrix}1&0&2\\4&3&5\\1&0&1\end{bmatrix} A^{-1}=\begin{bmatrix}-1&0&2\\-\frac{1}{3}&\frac{1}{3}&-1\\1&0&-1\end{bmatrix}

o sposobach liczenia macierzy możesz poczytać tutaj http://www.matematyka.pl/206408.htm
Chociaż patrząc na Twój nick zaczynam podejrzewać, że coś źle napisałem i mnie trolujesz :P

komentarz 8 kwietnia 2015 przez DarkEliat Bywalec (2,810 p.)
Jeszcze prawie nic nie robiłem w C++ Builderze, mam prawo nie wiedzieć.
komentarz 8 kwietnia 2015 przez DarkEliat Bywalec (2,810 p.)
Dzięki za chęci, ale nic nie rozumiem. Pewnie dlatego, że jestem w podstawówce.
komentarz 8 kwietnia 2015 przez iwan9449 Pasjonat (20,810 p.)
Na studiach zrozumiesz :)
komentarz 8 kwietnia 2015 przez Pan Kulomb Pasjonat (18,630 p.)
Dlaczego dopiero na studiach?
komentarz 8 kwietnia 2015 przez iwan9449 Pasjonat (20,810 p.)
Miałem na myśli to, że macierze przerabia się na studiach, ale oczywiście nic nie stoi na przeszkodzie, żeby poznać je samemu znacznie wcześniej :)
komentarz 16 kwietnia 2015 przez niezalogowany
Nie wiem w której jesteś klasie, ale któregoś dnia będziesz mieć niewiadome i układy równań z dwiema niewiadomymi (z klamerką). Potem gdzieś tam się przewijają z trzema, ale to już rzadko. Nie znaczy to, że nie może być tych niewiadomych więcej. Jak dostałbyś układ np. 4 równań, w których są 4 niewiadome, to łatwo się pomylić przy liczeniu metodami "szkolnymi". Dlatego powstały macierze. Z nimi możesz rozwiązywać praktycznie dowolnie duże układy równań. Z tym, że macierze mają zastosowanie do masy innych rzeczy, ale czasami potrzebna jest macierz odwrotna, wyznacznik macierzy itp. Dziedzina matematyki, która tym się zajmuje to algebra liniowa.
+1 głos
odpowiedź 12 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
edycja 13 kwietnia 2015 przez Kabotyn

Ja znam jeden sposób. Nie jest najwygodniejszy, robiłem relatywnie którko, na pewno możnaby go ulepszyć, ale działa.

Tym sposobem jest... użycie mojej klasy statycznej (z metodami statycznymi).

https://github.com/Kabotyn/InvertedMatrix

MyMatrix.h i MyMatrix.cpp

W pliku main.cpp jest przykładowe użycie, z danych wczytaych z pliku matrix_input.txt wynik wyswietlany jest na ekranie i zapisywany do matrix_output.txt (musisz zmienić sobie scieżki tych plików, bo na pewno bedziesz miał inne). Zapakowałem to wszystko do klasy, bo łatwiej było to ogarnąć, ale to taka "oszukana" klasa, to się chyba nazywa klasa abstrakcyjna, ale tego nie jestem pewny.

Tak czy siak, całość jest oparta na wektorach wektorów typu double. Nie mam C++ Buildera, więc nie wiem czy zadziała na 100% także jak będzie Ci się chciało sprawdzać to możesz dac znać.

 

komentarz 12 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
W pierwszym wierszu pliku jest liczba N, reprezentuje wymiar macierzy (tylko macierze kwadratowe, więc liczba jest jedna).
0 głosów
odpowiedź 8 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
Jak nie podejmujesz się zrobienia funkcji samodzielnie to chyba pozostaje Ci podjęcie wiekszej liczby prób aby odpalić boost'a z Builderem. Nie korzystam z buildera więc nie wiem jak to zrobić. Boost ma binarki pod windowsa (nie używałem ich), po instalacji trzeba dołączyć odpowiednie biblioteki do projektu w builderze. Pewnie gdzies w menu->project add coś tam....

Nie mniej, proponuję samemu zorbić taką funkcję, może być duży "fun" i szansa na to aby poćwiczyć sobie algorytmy i upraszczanie kodu i pętle :P
komentarz 8 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
Przy macierzy 8x8 może być probelm z wyznacznikiem 7x7, ale i to się robi. Od biedy można oskryptować sposób "ręczny".
0 głosów
odpowiedź 11 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)

Witam ponownie
Znalazłem kod, który przekształca macierz na macierz odwrotną. Było by spoko gdyby nie to że w Visual Studio 2013 działa, ale w Borland c++ builder 6 wywala błąd z dzieleniem przez zero.
Oto kod:

#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <ctime>
//---------------------------------------------------------------------------
using namespace std;
#pragma argsused
int main(int argc, char* argv[])
{
        int W;
	cout << "podaj rozmiar macierzy ";
	cin >> W;
	float **Tab;
	float **t;
	int i, j, k;
	Tab = new float *[W];
	t = new float*[W];
	for (j = 0; j<W; j++)Tab[j] = new float[j];
	for (j = 0; j<W; j++)t[j] = new float[j];
	cout << "macierz pierwotna\n\n";
	for (i = 0; i<W; ++i)
	{
		for (j = 0; j<W; ++j)
		{
			Tab[i][j] = rand() % 10;
			cout << Tab[i][j] << " ";
		}
		cout << "\n";
	}

	for (i = 0; i<W; i++)
	{
		Tab[i][i] = 1 / Tab[i][i];
		for (j = 0; j<W; j++) if (j != i)
		{
			Tab[j][i] = Tab[j][i] * Tab[i][i];
			for (k = 0; k<W; k++) if (k != i)
			{
				Tab[j][k] -= Tab[j][i] * Tab[i][k];
				if (j == (W - 1))
					Tab[i][k] = -(Tab[i][k] * Tab[i][i]);
			}
		}
	}

	cout << "\nmacierz odwrotna\n\n";
	int w = W - 1;
	for (j = 0; j<w; j++) Tab[w][j] = -(Tab[w][j] * Tab[w][w]);

	for (i = 0; i<W; i++)
	{
		for (j = 0; j<W; j++)
		{
			cout.width(10);
			cout << Tab[i][j] << " ";
		}
		cout << endl;
	}
	cout << "\n PRESS ENTER";
	cin.sync();
	cin.get();
	for (i = 0; i<W; ++i)
	{
		delete[] Tab[i];
		delete[] t;
	}
	delete[] Tab;
	delete[] t;
	return 0;
}

I faktycznie, dzielenie przez 0 występuje. Ale czemu w Visualu radzi sobie z tym problemem a w builderze nie?

Przez ten błąd zrezygnowałem z pisania tego samodzielnie, a tu się okazuje że mogłem pisać dobrze tylko w złym kompilatorze ^.^' Dodatkowo mam sporo napisane w builderze a Visual mnie nie lubi i mi się wywala+zawiesza, dlatego zależy mi żeby liczenie macierzy było w builderze. Jakiś pomysł jak to obejść? 

Podobne pytania

0 głosów
1 odpowiedź 241 wizyt
pytanie zadane 13 stycznia 2018 w C i C++ przez MikeMG Początkujący (330 p.)
0 głosów
4 odpowiedzi 2,878 wizyt
0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 16 września 2017 w Programowanie przez Qnk Nowicjusz (140 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...