Matris birinci sırada mı?


21

Bir tamsayı matrisi verildiğinde, bir sırada olup olmadığını sınayın, her satırın aynı vektörün katı olduğu anlamına gelir. Örneğin, içinde

 2   0  -20  10  
-3   0   30 -15
 0   0   0   0

her satırın bir katıdır 1 0 -10 5.

Aynı tanım satırların yerine sütunlarla da çalışır. Alternatif olarak, eğer bir çarpım tablosu gibiyse bir matris birinci sıradadır:

 *    1   0  -10  5
    ----------------
 2 |  2   0  -20  10  
-3 | -3   0   30 -15
 0 |  0   0   0   0

Her matris girişinin ilgili etiketlerin ürünü olması için satır etiketleri r[i]ve sütun etiketleri atadık .c[j]M[i][j]M[i][j] = r[i] * c[j]

Giriş:

Seçtiğiniz bir 2D kabı olarak bir tamsayı matrisi. Örneğin, listelerin listesi, 2B dizi veya benzeri. Dizi formatı gerektirmedikçe, genişliği veya yüksekliği ek girdi olarak almamalısınız.

Matris kare olmayabilir. En az bir sıfır olmayan girişe sahip olacaktır - boş veya sıfır matrislerle uğraşmanız gerekmez.

Tam sayıların taşma sorunlarına neden olmayacağını varsayabilirsiniz.

Çıktı:

Rütbe bir matrisler için tutarlı bir değer ve diğer matrisler için farklı bir tutarlı değer.

Dahili ins:

Sen olmayabilir herhangi yerleşik Hesaplamalar için rütbe kullanabilir veya doğrudan rütbe birini kontrol edin. Özdeğerler, ayrıştırmalar, vb. Gibi diğer yerleşik bileşenleri de kullanabilirsiniz, ancak işin çoğunu yapan yerleşik olmayan cevapların yükseltilmesini teşvik ediyorum.

Test durumları:

Sıra-one:

[[2, 0, -20, 10], [-3, 0, 30, -15], [0, 0, 0, 0]]
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]
[[-10]]
[[0, 0, 0], [0, 4, 11], [0, -4, -11]]

Rütbe değil:

[[-2, 1], [2, 4]]
[[0, 0, 3], [-22, 0, 0]]
[[1, 2, 3], [2, 4, 6], [3, 6, 10]]
[[0, -2, 0, 0], [0, 0, 0, 1], [0, 0, -2, 0]]

Liderler Sıralaması:


2
MatrixRank@#==1&
Meraklılar


2
Güzel bir teorem, sütun rütbesinin sonlu boyutlu matrisler için satır rütbesine eşit olmasıdır.
Sızdıran Rahibe

3
Kayan nokta hassasiyeti konusunda endişelenmek zorunda mıyız? Bir rütbe-1 matrisini, örneğin rütbe 2 gibi gösterebilirler
Luis Mendo

@LuisMendo 1.0000000001 özdeğerleri gibi hassas meseleleri ele almanız gerekir, ancak matrisin büyük olmadığını ve özellikle yanlış sınıflandırılmaya seçilmediğini varsayabilirsin.
xnor

Yanıtlar:


13

Jöle , 6 bayt

ẸÐfÆrE

Çevrimiçi deneyin!

Nasıl çalışır

ẸÐfÆrE  Main link. Argument: M (2D array)

ẸÐf     Filter by any, removing rows of zeroes.
   Ær   Interpret each row as coefficients of a polynomial and solve it over the
        complex numbers.
     E  Test if all results are equal.

Hassas

ÆrSayısal yöntemler kullanır, bu nedenle sonuçları genellikle yanlış olur. Örneğin, 6 - 5x + x² polinomunu temsil eden [6, -5, 1] girişi 3.000000000000000004 ve 1.9999999999999998 köklerine neden olur . Bununla birlikte, bir polinomun tüm katsayılarının aynı sıfır olmayan sabit ile çarpılması, eşit derecede kesin olmayan köklerle sonuçlanır. Örneğin, [6, -5, 1] ve [6 × 10 100 , -5 × 10 100 , 10 100 ] için aynı kökleri elde eder .Ær

Sınırlı hassas olduğunu belirtmek gerekir şamandıra ve karmaşık türleri olabilir hatalara yol açar. Örneğin, [1, 1] ve [10 100 , 10 100 + 1]Ær için aynı kökleri elde ederdi . Yana biz matris yanlış sınıflandırılabilir büyük ve özel olarak seçmedi değil varsayabiliriz , bir sorun olmaz.


5
Bir polinomun tüm katsayılarının aynı sıfır olmayan sabit sonuçlarla aynı sıfır olmayan sabit sonuçlarla çarpılması Bu mükemmel bir yaklaşım
Luis Mendo

8

Haskell , 50 bayt

rIntegers Falsematrisinin bir listesini alırsa, s matrisinin bir listesini alır ve eğer Truetersi sıralanırsa döner .

r l=or[map(x*)b<map(y*)a|a<-l,b<-l,(x,y)<-zip a b]

Çevrimiçi deneyin!

Nasıl çalışır

  • Bütün satırlar çiftleri oluşturur ave b(eşit sıra dahil), ve her bir çifti için sağlar, xve ykarşılık gelen elemanları aracılığıyla çalıştırın.
  • Çarpar satır btarafından xve satır aile y. Matris, yalnızca sonuçların her zaman eşit olması durumunda ve birini sıralayacaktır.
  • Çiftler her iki siparişte üretildiğinden, <herhangi bir eşitsizlik olup olmadığını kontrol etmek için kullanılabilir. Test sonuçlarının listesi, orantılı olmayan satırlar olup olmadığını orvererek birleştirilir True.

7

Mathematica, 51 33 bayt

RowReduce@#~Count~Except@{0..}<2&

Giriş

[{{2,0, -20,10}, {- 3,0,30, -15}, {0,0,0,0}}]

Kullanıcısından -14 bayt202729 junghwanmin'den
3 bayt daha kurtardı


Ben yerine yapının uzunluğu olan bir tablo buna eşit, düşündürmektedir First@#Hesaplayabileceğiniz, 0First@#her şeyi 0 çarpar 0'dır ve çarpma listable olduğundan. Ayrıca Tr[1^<list>]bir listenin uzunluğunu hesaplamak için kullanmayı da düşünebilirsiniz .
user202729 23:17

çok hoş. Düzenleyeceğim!
J42161217

Yerine 0#&@@#, {0..}çok çalışacak. Ve sonra Infixçalışır, böylece son kod RowReduce@#~Count~{0..}==Tr[1^#]-1&2 bayt tasarruf olabilir .
JungHwan Min

Aslında eşyalardan Exceptkurtulmak için kullanılabilir Tr. -3 bayt:RowReduce@#~Count~Except@{0..}==1&
JungHwan Min 23:17

Satır azaltılmış matrisin sıfır olmadığından emin olun (orijinal matris sıfır olmadığından), bu nedenle sayma sonucu pozitif bir tamsayı olur, bu nedenle <2yerine kullanılabilir ==1.
user202729 23:17

4

JavaScript (ES6), 68 67 65 bayt

Bu, Neil'in 05AB1E yanıtına dayanıyor ve benim orijinal yaklaşımımdan çok daha etkili.

falseBirincisi ve diğerini döndürür true.

f=(a,R,V,X)=>a.some(r=>r.some((v,x)=>R?v*V-r[X]*R[x]:f(a,r,v,x)))

Test durumları


Orijinal cevap, 84 bayt

falseBirincisi ve diğerini döndürür true.

a=>a.some(r=>r.some((x,i)=>(isNaN(x/=a.find(r=>r.some(x=>x))[i])?r:1/r[0]?r=x:x)-r))

Test durumları

Nasıl?

a => a.some(r =>          // given a matrix a, for each row r of a:
  r.some((x, i) =>        //   for each value x of r at position i:
    (                     //
      isNaN(x /=          //     divide x by a[ref][i]
        a.find(r =>       //       where ref is the index of the first row that
          r.some(x => x)  //       contains at least one non-zero value
        )[i]              //       (guaranteed to exist by challenge rules)
      ) ?                 //     we get NaN for 0/0, in which case:
        r                 //       use r, so that this column is ignored
      :                   //     else:
        1 / r[0] ?        //       if r is still holding the current row:
          r = x           //         set it to x (either a float, +Inf or -Inf)
        :                 //       else:
          x               //         use x
    ) - r                 //     subtract r from the value set above (see table)
  )                       //   end of some()
)                         // end of every()

Kodun sonunda yapılan çıkarma, aşağıda özetlenen birçok farklı duruma yol açabilir:

A                   | B              | A - B       | False / True
--------------------+----------------+-------------+-------------
array of 1 number   | same array     | 0           | False
array of 2+ numbers | same array     | NaN         | False
a number            | same number    | 0           | False
+Infinity           | +Infinity      | NaN         | False
-Infinity           | -Infinity      | NaN         | False
a number            | another number | <> 0        | True
+Infinity           | -Infinity      | +Infinity   | True
-Infinity           | +Infinity      | -Infinity   | True
a number            | +/-Infinity    | +/-Infinity | True
+/-Infinity         | a number       | +/-Infinity | True

Test bir truthy değer elde en kısa sürede başarısız: Biz (dışında iki ayrı oranı karşılaştıklarında Bu durumda 0/0 arasında) bir (i, y) ve bir (i, r) herhangi bir satır içinde y matrisin r sıfır olmayan bir sıranın dizinidir.


Huh, sadece merak ediyorum da ...
Neil

@Neil Yeni bir cevap olarak göndermek ister misiniz? Sadece bana bildir.
Arnauld,


3

Jöle , 12 bayt

ẸÐfµ÷"ЀZE€Ẹ

Çevrimiçi deneyin!

açıklama

ẸÐfµ÷"ЀZE€Ẹ  Main link
 Ðf           Filter; keep all elements where
Ẹ             At least one element is truthy (remove zero-rows)
      Ѐ      For each row on the right side
    ÷"        Divide it by each row in the original
        Z     Zip the array
          €   For each submatrix
         E    Are all rows equal?
           Ẹ  Is at least one of the elements from above truthy?

Açıklama, orijinal algoritmamın kilometresinin golf yorumuyum olduğundan, biraz yanlış olabilir.

Millerce -5 bayt


... Kodunuz paraya bağımlı. (Ben deja vu alıyorum ...)
tamamen insan

@icrieverytim Hey en azından dolar işaretlerinin sayısı bu sefer kod uzunluğunun yarısından az! : P
HyperNeutrino 23:17

1
@icrieverytim bir hatayı düzeltti ve şimdi daha az dolar işareti verdi: P
HyperNeutrino 23:17

Bu 12 için çok çalışması gerektiğini düşünüyoruz bayt ẸÐfµ÷"ЀZE€Ẹ Tio
mil

@miles Oh güzel! Sizin için olan yaklaşım biraz farklı (sanırım?) Yani istediğiniz cevabı kendinize gönderebilirsiniz :)
HyperNeutrino

3

05AB1E , 16 bayt

2ãεø2ãε`R*`Q}W}W

Çevrimiçi deneyin! Herhangi bir dikdörtgenin zıt köşelerinin aynı ürüne sahip olduğu çarpım tablosu özelliğini kullanır. Açıklama:

2ãε           }     Loop over each pair of rows
   ø                Transpose the pair into a row of pairs
    2ãε     }       Loop over each pair of columns
       `R*`Q        Cross-multiply and check for equality
             W W    All results must be true

3

TI-Basic (TI-83 serisi), 28 27 28 bayt (62 karakter)

:Prompt [A]
:{0→X
:Matr►list(ref([A])ᵀ,L₁,X
:not(max(abs(ᶫX

Matrisin satır-kademe biçimini hesaplar, [A]ilk sırasını (atılacak) içeriye L₁ve ikinci sırasına kaydeder ᶫX. O max(abs(ᶫXzaman ᶫXsadece sıfırlardan oluşuyorsa sıfır olur , aksi takdirde pozitif bir değer, not(eğer matris bir sıradaysa 1 olur, aksi takdirde 0 olur.

1 satırlık bir matris için, matrisin varolmayan ikinci satırına bakmaya çalıştığımızda ᶫXayarlanır {0}ve sonra değişmez.


Scott Milner sayesinde -1 bayt

1 satır matrisler için boyut hatasını düzeltmek için +1 bayt. İkinci satırı bir matristen sadece bir satır ile çıkarmaya çalışırsanız , Matr►list( komut şikayetini çözer; ancak, birinci ve ikinci sıranın her ikisini de matristen çıkarmayı denerseniz sessizce başarısız olur.


1
Bunun Prompt [A]yerine bir bayt kaydedebilirsiniz Ans→[A].
Scott Milner

@ScottMilner Teşekkürler! Orada biz böyle bir şey kullanırsanız ya önlemenin bir yolu muhtemelen ClrListinitialize ᶫXama oldukça az alanda o işe kazanılmış değil.
Misha Lavrov

İkinci satırdan kurtul, çünkü Matr►list(listenin üzerine yazacaktır, olmasa bile, 5 bayttan tasarruf edersin.
kamoroso94

1
@ kamoroso94 İkinci satırın amacı, var olmadığı zaman bir liste oluşturmak değildir: ikinci satırın noktası, matris yalnızca bir satır olduğunda ikinci satır için varsayılan bir değer oluşturmaktır. İkinci satırdan kurtulursanız, kod 1xN matrisler için çöker.
Misha Lavrov

2
@ kamoroso94 L1 yerine Y değil, ᶫY yazmalıyız; Aksi halde, hesap makinesi "ilk satırı ᶫY'ye, ikinci satırı ᶫX'e çıkarmak" değil, "matrisin Y-inci sırasını" X "e çıkar.
Misha Lavrov

3

Brachylog , 27 bayt

{⊇Ċ}ᶠzᵐ{↰₁ᶠ{⟨hz{t↔}⟩×ᵐ=}ᵐ}ᵐ

Çevrimiçi deneyin!

Neil'in "her dikdörtgenin karşıt köşelerinde bulunan ürünler eşit olmalıdır" yaklaşımını kullanır. Çapraz ürün maliyetlidir ve 10 tam bayt alır, ancak bu hala denediğim herhangi bir bölüme dayalı yaklaşımdan daha kısadır, çünkü esas olarak sorudaki truthy ve falsey için iki tutarlı çıkışın öngörülmesi - falsey yalnızca false.bir Sıfırla hatası, çok fazla bayt kullanır.

{⊇Ċ}ᶠzᵐ{↰₁ᶠ{⟨hz{t↔}⟩×ᵐ=}ᵐ}ᵐ
{⊇Ċ}ᶠ                        Get each pair of rows from the matrix
                             eg.: [ [[a, b, c], [k, l, m]], ... ]
     zᵐ                      Zip each pair's elements
                                  [ [[a, k], [b, l], [c, m]], ... ]
       {                 }ᵐ  Map this over each pair of rows:
                                  [[a, k], [b, l], [c, m]]
        ↰₁ᶠ                  Get each pair of paired elements from the rows
                                  [[[a, k], [b, l]], [[b, l], [c, m]], [[a, k], [c, m]]]
           {           }ᵐ    Map this over each pair of pairs
                                  [[a, k], [b, l]]
            ⟨hz{t↔}⟩         Zip the first pair with the reverse of the second
                                  [[a, l], [k, b]]
                    ×ᵐ       Multiply within each sublist
                                  [al, kb]
                      =      The results should be equal
                             (If the results are unequal for any pair, the whole predicate fails,
                              and outputs false.)

Öğe bazında bölünmeye dayalı alternatif yaklaşım ( 30 bayt ):

{≡ᵉ¬0&}ˢ\↰₁ˢ{c׬0&⟨hz∋⟩ᶠ/ᵐ²=ᵐ}

Çevrimiçi deneyin!


2

Jöle , 9 bayt

ẸÐf÷g/$€E

Çevrimiçi deneyin!

ẸÐf         Discard zero rows
   ÷  $€    Divide each row by
    g/        its greatest common divisor
        E   Does this list have only one unique element?

1

SageMath, 40 bayt

lambda M:any(M.rref()[1:])*(M.nrows()>1)

Çevrimiçi deneyin

Bu anonim işlev, Falseeğer matris birinci ise ve Trueaksi takdirde döner .

Fonksiyon Mgirdi olarak bir matris alır , onu azaltılmış satır-kademe formuna ( M.rref()) dönüştürür ve birinciyi anysıfır olmayan satırdan sonra test eder. Ardından, bu değer ile çarpılır M.nrows()>1(matrisin birden fazla satırı var mı?).


1

Python 3 , 93 91 bayt

lambda m,e=enumerate:any(h*g-r[j]*s[i]for r in m for i,h in e(r)for s in m for j,g in e(s))

Çevrimiçi deneyin!

Nasıl çalışır

Herhangi bir 2-küçük sıfır olmayan belirleyici olup olmadığını denetler. Eğer durum buysa, sıralama en az 2 olmalıdır: "Kaybolan bir p-minor (sıfır olmayan determinantlı p x p alt matrisi), o alt matrisin satırlarının ve sütunlarının doğrusal olarak bağımsız olduğunu ve bu satırların ve tam matrisin sütunları lineer olarak bağımsızdır (tam matristeki), bu nedenle satır ve sütun sırası en az determinant sıralaması kadar büyüktür "( Wikipedia'dan )

Not: user71546'nın yorumu sayesinde iki baytı traş etti.


1
91 - fonksiyon argümanlarına numaralandırıp koyma ve böylece aşağıdakileri yapma ihtiyacını ortadan kaldırarak daha kısa f=:lambda m,e=enumerate:any(h*g-r[j]*s[i]for r in m for i,h in e(r)for s in m for j,g in e(s))
Shieru Asakoto

@ user71546 Teşekkürler! Bitti!
Luca Citi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.