Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Dělám do školy program na výpočet libovolného determinantu. Když jsem po týdnu vymyslel jak na to, tak mi to někde blbne. Nacpu tomu list (př [[1, 2, 3][4, 8, 7][8, 9, 6]]) vnořený list je řádek)
def detr(det, i): #Tohle upravuje determinant dělá z něj sub determinant K = det del K[0] for y in xrange(len(K)): del K[y][i] return K def determinant(det, stupen): if stupen == 2: d = det[0][0]*det[1][1] - det[0][1]*det[1][0] else: d = 0 for i in xrange(stupen): M = detr(det, i) print stupen d = d + (-1)**(i-1)*det[0][i]*determinant(M, (stupen -1) ) return dAž po první determinant 2. stupně to jede dobře, jenže když to má udělat další determinant 2. stupně, tak se to K zase zkrátí a já už prostě nevím, jak udělat to zkracovaní. Předem moc dík za každou radu. Vím, že existuje numpy, ale v zadání je zpracujte algoritmus. Kdyby měl někdo jiný nápad na řeší determinantů přivítal bych to.
Tiskni
Sdílej:
Momentálně si vzpomenu jen na výpočet rozkladem a to by se snad dělalo rekurzí, když neznáš předem hodnost matice?
Ok, do pythonu jsem se ještě nedostal. Ten součet permutací, sudejch a lichejch sloupců a řádků asi zohledňuješ?
Mluvim o tom, že na řádku 1, skoupci 1, je determinant kladnej, na 1/2 je zápornejm na 2/2 kladnej ...
y = [1, 2, 3]
x = y
del x[0]
if y[0] == 2 :
print "true"
tak to vypíše true, protože přiřazení je přiřazení referencí jako v Javě. Dá se to spravit něčím jako x=y[:]
. Doporučuju přečíst si nějakou učebnici Pythonu, tohle by měl být základ.
Možná že to máš "dobře" (i když když to nefunguje tak asi těžko...), ale prakticky je to zcela nepoužitelný. Protože u algoritmu se složitostí O(n!) končíš na n v řádu jednotek.
Takže ten kód rovnou zahoď a napiš si prachobyčejnou Gaussovu eliminaci. Vynásobenim prvků na diagonále pak získáš determinant. Složitost O(n^3).
pr = r < vr ? r : r + 1; ps = s < vs ? s : s + 1;Ten zbytek už je jednoduchý.
Už jsem to pochopil.
Nepochopil. Zkus to tady, třeba tomu budeš rozumět v češtině líp.
Pokuď v GEM používáš pouze úpravu typu přičtení násobku řádku k jinému řádku jak je obvyklé, získáš determinant původní matice pouhým vynásobením prvků na diagonále trojúhelníkové matice vzniklé z matice původní pomocí GEM.
Nevím jaký je přesně zadání, ale pokuď v něm neni, že se MUSÍ použít výpočet pomocí subdeterminantů, tak výše uvedenj postup použít rozhodně lze. Naopak, pokuď v zadání není dáno, že musíš použít výpočet pomocí subdeterminantů, měl by tě s tím co tady "patláš" zadavatel okamžitě vyhodit. Protože s někým, kdo použije algoritmus s O(n!) tam, kde existuje jednodušší algoritmus s O(n^3) se nic jinýho udělat nedá...
Tyjo to jsem dělal ještě na střední ve druháku. Můžu dát jedině kód v C#, ale nijak za něj neručím, v té době jsem ještě ani nevěděl, co je to lineární algebra a C# jsem taktéž moc neovládal. Takže nepište že jsem vůl a tak.
using System;
namespace Calc
{
public class Matrix
{
protected double[,] MatrixData;
protected int my, nx;
//
//INDEXER
//
//for access to mambers
//arrays are indexing from 0! but matrix from 1
public double this [int m, int n]
{
get
{
return MatrixData[m-1, n-1];
}
set
{
MatrixData[m-1, n-1] = value;
}
}
//
//CONSTRUCTORS
//
//constructor with size of MatrixData
public Matrix(int m, int n)
{
//m+1 and n+1 for counting from 1 (matrix is a11 .. amn)
MatrixData = new double[m, n];
my = m;
nx = n;
}
//matrix from array and size
public Matrix(double[,] MatrixArray, int m, int n)
{
MatrixData = new double[m, n];
for(int x = 0; x <= m-1; x++)
for(int y = 0; y <= n-1; y++)
MatrixData[x, y] = MatrixArray[x, y];
my = m;
nx = n;
}
//new matrix from existing matrix
public Matrix(Matrix ExistingMatrix)
{
MatrixData = ExistingMatrix.GetMatrix();
my = ExistingMatrix.GetM();
nx = ExistingMatrix.GetN();
}
//
//OPERATORS
//
//addition Matrix+Matrix
public static Matrix operator+(Matrix A, Matrix B)
{
//size of matrix must be the same as A and B
Matrix C = new Matrix(A);
for(int m = 1; m <= A.GetM(); m++)
for(int n = 1; n <= A.GetN(); n++)
C[m, n] = A[m, n] + B[m, n];
return C;
}
//multiply Matrix*Matrix
public static Matrix operator*(Matrix A, Matrix B)
{
Matrix C = new Matrix(A.GetM(), B.GetN());
double sum;
for(int m = 1; m <= A.GetM(); m++)
for(int n = 1; n <= B.GetN(); n++)
{
sum = 0;
for(int i = 1; i <= A.GetN(); i++)
sum += A[m, i] * B[i, n];
C[m, n] = sum;
}
return C;
}
//multiply double*Matrix
public static Matrix operator*(double a, Matrix B)
{
Matrix C = new Matrix(B);
for(int m = 1; m <= B.GetM(); m++)
for(int n = 1; n <= B.GetN(); n++)
C[m, n] = a * B[m, n];
return C;
}
//multiply Matrix*double
public static Matrix operator*(Matrix A, double b)
{
return b * A;
}
//compare
public static bool operator==(Matrix A, Matrix B)
{
return A.Equals(B);
}
//compare
public static bool operator!=(Matrix A, Matrix B)
{
return !A.Equals(B);
}
//invert
public static Matrix operator~(Matrix X)
{
return X.Invert();
}
//
//GETS
//
//returns array with matrix
public double[,] GetMatrix()
{
return (double[,])MatrixData.Clone();
}
//returns m - y size
public int GetM()
{
return my;
}
//returns n - x size
public int GetN()
{
return nx;
}
public override bool Equals(object obj)
{
if(obj is Matrix)
{
Matrix A = (Matrix)obj;
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
if(this[m, n] == A[m, n])
return true;
return false;
}
else
return false;
}
//
//COUNTING
//
//second determinant
public double Determinant2()
{
return this[1, 1] * this[2, 2] -
this[1, 2] * this[2, 1];
}
//third determinant
public double Determinant3()
{
return this[1, 1] * this[2, 2] * this[3, 3] -
this[1, 1] * this[2, 3] * this[3, 2] +
this[1, 2] * this[2, 3] * this[3, 1] -
this[1, 2] * this[2, 1] * this[3, 3] +
this[1, 3] * this[2, 1] * this[3, 2] -
this[1, 3] * this[2, 2] * this[3, 1];
}
//n-scale determinant
public double Determinant(int n)
{
switch(n)
{
case 2:
return Determinant2();
case 3:
return Determinant3();
default:
double result = 0;
for(int i = 1; i <= this.GetN(); i++)
result += this[1, i] * this.Addition(1, i);
return result;
}
}
//addition of mamber
public double Addition(int m, int n)
{
Matrix X = new Matrix(this.GetM()-1, this.GetM()-1);
int i = 1, j;
for(int x = 1; x <= this.GetM(); x++)
{
j = 1;
for(int y = 1; y <= this.GetM(); y++)
{
if(m != x && n != y)
{
X[i, j] = this[x, y];
j++;
}
}
if(x != m)
i++;
}
return System.Math.Pow(-1, m+n) * X.Determinant(this.GetM()-1);
}
//invert matrix
public Matrix Invert()
{
Matrix X = new Matrix(this.GetM(), this.GetM());
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
X[n, m] = this.Addition(m, n);
return (1/this.Determinant(this.GetM())) * X;
}
//rotate matrix right
public void RotateRight()
{
Matrix X = new Matrix(this.GetN(), this.GetM());
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
X[n, this.GetM() - m + 1] = this[m, n];
MatrixData = X.GetMatrix();
my = X.GetM();
nx = X.GetN();
}
public Matrix Transpone()
{
Matrix X = new Matrix(this.GetN(), this.GetM());
for(int m = 1; m <= this.GetM(); m++)
for(int n = 1; n <= this.GetN(); n++)
X[n, m] = this[m, n];
return X;
}
public override string ToString()
{
string s = "";
for(int m = 1; m <= this.GetM(); m++)
{
s += "(";
for(int n = 1; n < this.GetN(); n++)
s += this[m, n].ToString() + "; ";
s += this[m, this.GetN()].ToString() + ")\n";
}
return s;
}
public object Clone()
{
return new Matrix(this);
}
}
}
Jeho jediným problémem je, že se v něm asi dá těžko dělat v týmu...Řekl bych, že existence CPANu to dosti přesvědčivě vyvrací
Neznám Python ani Perl, ale Python opravdu není "jen hezčí Perl".To zrovna nezní jako kvalifikovaný názor
to nie, on je len obeťou masívnej ohováracej kampane tých, čo mu nie sú schopní porozumieť
from numpy import matrix from scipy.linalg import det A = matrix([[1,2],[3,4]]) print det(A)
#!/usr/bin/python def detr(det, i): K = det del K[0] for y in xrange(len(K)): del K[y][i] return K def determinant(det, stupen): print "Stupen1: " , stupen if stupen == 2: print "Stupen2a: " , stupen d = det[0][0]*det[1][1] - det[0][1]*det[1][0] else: print "Stupen2b: " , stupen d = 0 print "len det 0 " , len(det[0]) for i in xrange(stupen): M = detr(det, i) print "det[0][",i,"]=",det [0][i] print "M=",M print "det=",det d = d + (-1)**(i-1)*det[0][i]*determinant(M, (stupen -1) ) print "Subdeterminant pro " , stupen , " je " , d return d mat=[[1, 2, 3],[4, 8, 7],[8, 9, 6]] print determinant(mat,len(mat));Bohuzel mi to ale hlasi chybu - tohle je cely vystup z toho programu.
Stupen1: 3 Stupen2b: 3 len det 0 3 det[0][ 0 ]= 8 M= [[8, 7], [9, 6]] det= [[8, 7], [9, 6]] Stupen1: 2 Stupen2a: 2 Subdeterminant pro 2 je -15 det[0][ 1 ]= Traceback (most recent call last): File "./det.py", line 30, in ? print determinant(mat,len(mat)); File "./det.py", line 21, in determinant print "det[0][",i,"]=",det [0][i] IndexError: list index out of rangePokud jsem python dobre pochopil a podle vypisu interpretoval, tak python predava seznamy jako odkazy a nedela kopie. Cili, jakakoliv destruktivni zmena seznamu K (resp. parametru "det") ve funkci detr se projevi zmenou puvodniho seznamu "det" ve funkci determinant. Jak jsem psal, nejsem pythonista, takze ti neporadim, jak udelat kopii seznamu a predat do funkce k destrukci tak, aby puvodni seznam zustal, ale nejakej pythonista by to vedet mohl. Zkusim jeste mrknou na nejaky ucebnice, neco by se najit mohlo.
#!/usr/bin/perl sub detr { my ($i,$k)=@_; my $r=[]; for (my $y=1;$y<scalar(@{$k});$y++) { push @{$r},[@{$k->[$y]}]; splice @{$r->[$y-1]},$i,1; } return $r; } sub determinant { my ($det)=@_; my $stupen=scalar(@{$det}); if ($stupen==1) { return $det->[0][0]; } elsif ($stupen==2) { return $det->[0][0]*$det->[1][1]-$det->[0][1]*$det->[1][0]; } else { my $d=0; for (my $i=0;$i<$stupen;$i++) { my $m=detr($i,$det); $d+=(-1)**($i)*$det->[0][$i]*determinant($m); } return $d; } } $mat=[ [1,2,3], [4,8,7], [8,9,6] ]; print determinant($mat) . "\n";A mam k tomu par komentaru:
(-1)**(i-1)
, ale spravne ma byt (-1)**i
, protoze ten vzorecek je spravne (-1)**(radek+sloupec)
takze zacinas 0+0, coz je nula a -1 na nultou je jedna kladna, takze je to dobre, ale tobe vychazi pro prvni hodnotu, kdy i==0, -1 na -1, coz je -1 a to je spatne.$a=[ [1,2,3] ]; $b=[ [@{$a->[0]}] ];ono to sice vypada neprehledne, ale pokud clovek zna aspon zaklady perlu, tak to uvidi hned. $a je reference na anonymni array, ktery obsahuje jeden prvek a tim je odkaz na anonymni array se tremi prvky 1, 2 a 3. Na druhem radku pak vytvarim do promenne $b referenci na jiny anonymni array, do ktereho vlozim jeden prvek, ktery je odkaz na dalsi anonymni pole, do ktereho vlozim hodnoty - a ty se vlozit zpusobem takovym, ze se odkazu na 1.prvek (index 0) anonymniho pole odkazovaneho promennou $a
$a->[0]
, tento prvek obsahuje odkaz na anonymni pole s prvky 1, 2, 3, takze to necham vyhodnotit jako obycejne pole @{$a->[0]}
, coz bude prave to pole tech hodnot (uz to tedy nebude odkaz na to anonymni pole, ale konkretni -zkopirovane- hodnoty) a ty se mi vlozi do toho noveho anonymniho pole [ @{$a->[0]} ]
, ktere je ulozene jako prvni prvek celeho anonymniho pole odkazovaneho prom. $b = [ [ @{$a->[0]} ] ]
Kdyz se pokusim v pythonu udelat tohle
>>> a=[ [ 1,2,3] ] >>> b=[] >>> c=[] >>> b+=[a[0]] >>> c.append(a[0]) >>> a [[1, 2, 3]] >>> b [[1, 2, 3]] >>> c [[1, 2, 3]] >>> del b[0][1] >>> del c[0][1] >>> a [[1]] >>> b [[1]] >>> c [[1]]vidite sami, ze oba zpusoby
b+=...
i c.append
nevlozi konkretni hodnoty, ale referenci. V docu k pythonu to pisou, ze se kopiruje reference, ale nenasel jsem nic o tom, jak seznam vratit jako novy seznam hodnot.
#!/usr/bin/perl use Data::Dumper; sub detr { my ($i,$k)=@_; my $r=[]; for (my $y=1;$y<scalar(@{$k});$y++) { push @{$r},[@{$k->[$y]}]; splice @{$r->[$y-1]},$i,1; } return $r; } sub determinant { my ($det)=@_; my $stupen=scalar(@{$det}); if ($stupen==1) { return $det->[0][0]; } else { my $d=0; for (my $i=0;$i<$stupen;$i++) { my $m=detr($i,$det); $d+=(-1)**($i)*$det->[0][$i]*determinant($m); } return $d; } } $mat=[ [1,2,3], [4,8,7], [8,9,6] ]; print determinant($mat) . "\n";
a=[[1], [2], [3], [4], [5, "a"]] for i in range(0,len(a)): b=a[:i]+a[i+1:] print bJinak vytvoření kopie listu není problém:
b=list(a)
a=[1,2,3]
b=a[:]
a nebo modul copy a funkce deepcopy:)
#!/usr/bin/python # vim:set et: def detr(det, i): K = [] for y in range(1,len(det)): K.append(det[y][:i]+det[y][i+1:]) return K def determinant(det, stupen): if stupen == 2: d = det[0][0]*det[1][1] - det[0][1]*det[1][0] else: d = 0 for i in xrange(stupen): M = detr(det, i) d = d + (-1)**i*det[0][i]*determinant(M, (stupen -1) ) return d mat=[[1, 2, 3],[4, 8, 7],[8, 9, 6]] print determinant(mat,len(mat));a pak jeste pokud bys chtel koncit az ve stupni 1
#!/usr/bin/python # vim:set et: def detr(det, i): K = [] for y in range(1,len(det)): K.append(det[y][:i]+det[y][i+1:]) return K def determinant(det, stupen): if stupen == 1: d = det[0][0] else: d = 0 for i in xrange(stupen): M = detr(det, i) d = d + (-1)**i*det[0][i]*determinant(M, (stupen -1) ) return d mat=[[1, 2, 3],[4, 8, 7],[8, 9, 6]] print determinant(mat,len(mat));No, vypada to, ze to chodi. Tak snad to pomuze.
Vždycky mě dostane do kolen, když script-kiddies hodlají "optimalizovat" svůj algoritmus s exponenciální složitostí pro problém, kde existuje řešení s polynomiální složitostí pomocí podobnejch metod...
Pro ty co by snad na tuhle diskuzi narazili někdy v budoucnu a chtěli odsud kopírovat některý z uvedených kódů v příloze uvádim obrázek, po jehož shlédnutí by si to měl rozmyslet i negramotný chovanec Guatemalského ústavu pro choromyslné...
mat A[X,X]=[ hodnoty matice] det(A)a mam vypocet rychle a presne (prepokladam, ze v takovym programu budou pouzity jedny z nejrychlejsich algoritmu). Nicmene, hledani chyb v cizich programech je dobra skola programovani. Clovek u toho musi premyslet, co tim chtel autor vlastne rict a kde je teda chyba.
V gnuplotu.
set terminal png size 500,300 set output "determinant.png" set xrange [0:8] set grid set xlabel "Velikost matice" set ylabel "Čas výpočtu" plot x**3 title "Gaussova eliminace", \ sqrt(2*pi*x)*x**x * exp(-x) title "Metoda kofaktorů"
Možná ještě jeden "údernější":
set terminal png size 500,300 set output "determinant.png" set xrange [2:100] set logscale y set grid set title "Porovnání výpočetní složitosti determinantu matice" set xlabel "Velikost matice" set ylabel "Čas výpočtu" plot x**3 title "Gaussova eliminace", \ sqrt(2*pi*x)*x**x * exp(-x) title "Metoda kofaktorů"
Chápu Gaussovu eliminaci dobře
Ne tak docela. LU dekompozice není částí Gaussovy eliminace. Zjednodušeně řečeno je LU dekompozice modifikovanou Gaussovou eliminací.
LU dekompozice rozkládá původní matici na součin dou trojúhelníkových matic (jedna dolní a jedna horní), Gausova eliminace matici pouze upravuje na horní trojúhelníkový tvar. K efektivnímu výpočtu determinantu se nicméně dá použít jak LU dekompozice tak Gaussova eliminace.
Jinak "finta" je skutečně v tom, že jediný nenulový součin z výpočtu determinantu je u trojúhelníkové matice právě ten na diagonále.