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

Macierz odwrotna identyfikacja algorytmu

Object Storage Arubacloud
0 głosów
214 wizyt
pytanie zadane 3 sierpnia 2023 w Algorytmy przez Mariusz M Obywatel (1,640 p.)
edycja 3 sierpnia 2023 przez Mariusz M
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void inverse(double **A,unsigned int n, unsigned int *error)
{
unsigned int i,j,l,k;
double   maxA,d,e;
unsigned int *M;
M=(unsigned int*)malloc(n*sizeof(unsigned int));
  (*error)=0;
  for(i=1;i<=n;i++)
  {
    // Czesciowy wybor elementu glownego wg wzoru (1.49)
    maxA=0.0;
    for(j=i;j<=n;j++)
    {
      d=A[j - 1][i - 1];
      if(fabs(maxA)<fabs(d))
      {
        maxA=d;
        k=j;
      }
    }
    if(maxA==0.0)
    {
      (*error)=1;
      free(M);
      return;
    }
    /* Zapisywanie wskaznikow wierszy wystepowania elementu
      ekstremalnego w i-tej iteracji w postaci wektora M[i] */
    M[i - 1]=k;
    A[k - 1][i - 1]=1.0;
    for(j=1;j<=n;j++)
    {
      // Przestawienie i-tego wiersza z k-tym
      d=(double)(A[k - 1][j - 1]/maxA);
      A[k - 1][j - 1]=A[i - 1][j - 1];
       A[i - 1][j - 1]=d;
    }
    // Generacja ciagu macierzy (1.42) wg wzoru rekurencyjnego (1.41)
    for(j=1;j<=n;j++)
      if(j!=i)
      {
        d=A[j - 1][i - 1];
        A[j - 1][i - 1]=0.0;
        for(l=1;l<=n;l++)
        {
          e=d*A[i - 1][l - 1];
          A[j - 1][l - 1]-=e;
        }
        }
  }
  // Przestawianie kolumn macierzy zgodnie z wektorem wskaznikow M[i] (1.46)
  for(i=n;i>=1;i--)
  {
    k=M[i - 1];
    if(k!=i)
      for(j=1;j<=n;j++)
      {
        d=A[j - 1][i - 1];
        A[j - 1][i - 1]=A[j - 1][k - 1];
        A[j - 1][k - 1]=d;
        }
  }
  free(M);
}





int main(int argc, char **argv)
{
    FILE *in;
    FILE *out;
    unsigned int i,j,n;
    unsigned int  error;
    double **A;

    if ((in = fopen(argv[1], "rt"))
       == NULL)
   {
      fprintf(stderr, "Cannot open input file.\n");
      return 1;
   }

   if ((out = fopen(argv[2], "wt"))
       == NULL)
   {
      fprintf(stderr, "Cannot open output file.\n");
      return 1;
   }

   while(!feof(in))
   {
      fscanf(in,"%d",&n);
      A=(double**)malloc(n*sizeof(double*));
      for(i=0;i<n;i++)
        A[i]=(double*)malloc(n*sizeof(double));
      for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
             fscanf(in,"%lf",&A[i - 1][j - 1]);
      inverse(A,n,&error);
      if(error==0)
      {
         for(i=1;i<=n;i++)
         {
             for(j=1;j<=n;j++)
                 fprintf(out,"%.12lf ",A[i - 1][j - 1]);
             fprintf(out,"\n");
         }
      }
      else
         fprintf(out,"Macierz osobliwa \n");
      for(i=0;i<n;i++)
          free(A[i]);
      free(A);
   }
   fclose(in);
   fclose(out);
   return 0;
}

 

Powyższy kod znalazłem w książce Bernarda Barona Metody numeryczne w Turbo Pascalu

(chociaż książka jest już niedostępna to kody są dostępne na stronie Helionu)

i przetłumaczyłem go na C

 

Znalazłem także w książce Knutha Sztuka programowania następujący algorytm

https://pdfhost.io/v/s7g7JnkFf_Knuth_inverse_matrix

 

Czy funkcja odwracania macierzy z kodów dołączonych do książki Bernarda Barona jest

zapisem algorytmu z książki Knutha ?

Jaki algorytm został tutaj przedstawiony

 

 

 

 

 

 

komentarz 3 sierpnia 2023 przez Oscar Nałogowiec (29,320 p.)
   while(!feof(in))

 

Widać, że kod przeniesiony z Pascala. smiley

W C sprawdza się czy operacja czytania się udała.

komentarz 3 sierpnia 2023 przez manjaro Nałogowiec (37,390 p.)

@Mariusz M, zamiast tworzyć takiego gniota z niezrozumiałym kodem lepiej zaimplementować samodzielnie jakąś prostą metodę.

Do wyboru masz dwie podstawowe metody

- metodę Gaussa

- metodę za pomocą wyznaczników

Ta druga jest chyba łatwiejsza. Wystarczy napisać funkcję rekurencyjną do liczenia wyznacznika metodą Laplace'a i do tego funkcję transponowania macierzy.

komentarz 4 sierpnia 2023 przez Mariusz M Obywatel (1,640 p.)
O mądrala się znalazł - do tego komentarz nie na temat
komentarz 4 sierpnia 2023 przez Mariusz M Obywatel (1,640 p.)
edycja 4 sierpnia 2023 przez Mariusz M
Oscar to miał być temat o tym konkretnym algorytmie
i na razie chciałbym się na tym skupić
Czy to co znalazłem u Barona to jest to samo co u Knutha
Jak i dlaczego ten algorytm(y) działa(ją)
Później mogę cię zapytać jak proponowałbyś dopisać obsługę błędów
(jak to ująłeś sprawdzać czy operacja czytania się udała)
komentarz 4 sierpnia 2023 przez manjaro Nałogowiec (37,390 p.)
Nie ma za co.

Podłość ludzka nie zna granic...
1
komentarz 8 sierpnia 2023 przez Mariusz M Obywatel (1,640 p.)
No komentarze tego manjaro są nie na temat bo tematem jest konkretny algorytm,

jego porównanie z tym co przedstawione jest u Knutha

i opisanie jego działania

Komentarze tego manjaro w dodatku są obraźliwe "gniot" itp

"gniota z niezrozumiałym kodem "

to naucz się czytać kod albo w ogóle nie komentuj
1
komentarz 9 sierpnia 2023 przez manjaro Nałogowiec (37,390 p.)
Jako jedyny próbowałem ci pomóc.

A ty zamiast podziękować to zgłaszasz moje posty. Zastanów się nad sobą i swoim postępowaniem.

Podałem ci najlepsze możliwe rozwiązanie w tej sytuacji. Nie znam języka C żeby zrozumieć algorytm który przepisałeś, więc nie będę go interpretował. Zakładam że jest tam zaimplementowana jedna z metod które ci podałem.

Kodu sam nie rozumiesz, bo nie wiesz co ten kod robi a do mnie masz problem. Przepisz ten kod do Pythona to powiem ci co to za algorytm.

Trochę szacunku do innych powinieneś się nauczyć bo nikt ci nie będzie chciał pomagać w przyszłości. W każdym razie na mnie nie licz.
2
komentarz 9 sierpnia 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)
Wg mnie niepotrzebnie rozkręciliście tutaj taką niemiłą dyskusję.

Warto zauważyć, że komentarze pod pytaniem są do tego, aby móc napisać coś niekoniecznie związanego z tematem, czyli coś co wprost nie musi odpowiadać na dane pytanie, ale jest nadal z nim związane. Jeśli więc dany komentarz nie jest całkowitym offtopem, a po prostu okazał się niepomocny, to myślę że można go pominąć lub napisać np. "Dzięki, ale nie tego oczekiwałem, nie pomaga mi to" i tyle. Jednocześnie jeśli druga strona pisze, że nie zna w ogóle języka i nie będzie nawet interpretowała algorytmu, który jest ważną częścią pytania, no to można się zastanowić czy pisanie wypowiedzi na pewno ma w takim przypadku sens.

Proponuję jednak pomimo to zostać przy tym, że jeśli ktoś próbuje coś doradzić, to można na tę poradę spojrzeć i jeśli nie jest w porządku, to po prostu z niej nie skorzystać, bez wzajemnego wytykania epitetów "gniot" czy "mądrala", bo to akurat nie pomaga na pewno zupełnie nic.
komentarz 9 sierpnia 2023 przez manjaro Nałogowiec (37,390 p.)
Jeżeli ktoś pisze kod, którego nie rozumie, który nie wiadomo co robi, to czyż nie jest to gniot?

Czy nie byłoby sensowniej napisać kod który się rozumie według podanego algorytmu?

Moim zdaniem autor pytania zwyczajnie się czepia bo nie ma pojęcia jak samodzielnie napisać nowy zrozumiały kod. Znalazł coś i nie wie co to jest, a wykładowca na uczelni pewnie określił konkretną metodą realizacji...

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 921 wizyt
0 głosów
1 odpowiedź 76 wizyt
pytanie zadane 17 listopada 2020 w Algorytmy przez SmaczySchabowy Początkujący (270 p.)
0 głosów
1 odpowiedź 133 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,965 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...