Là ma trận xếp hạng một?


21

Đưa ra một ma trận các số nguyên, kiểm tra xem nó có xếp hạng một không, có nghĩa là mỗi hàng là bội số của cùng một vectơ. Ví dụ: trong

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

mỗi hàng là bội số của 1 0 -10 5.

Định nghĩa tương tự cũng hoạt động với các cột thay cho các hàng. Ngoài ra, một ma trận là thứ hạng nếu nó giống như một bảng nhân:

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

Chúng tôi đã gán nhãn hàng r[i]và nhãn cột c[j]sao cho mỗi mục nhập ma trận M[i][j]là sản phẩm của các nhãn tương ứng như M[i][j] = r[i] * c[j].

Đầu vào:

Một ma trận số nguyên như một thùng chứa 2D bạn chọn. Ví dụ: danh sách các danh sách, mảng 2D hoặc tương tự. Bạn không nên lấy chiều rộng hoặc chiều cao làm đầu vào bổ sung trừ khi định dạng mảng yêu cầu.

Ma trận có thể không vuông. Nó sẽ có ít nhất một mục nhập khác - bạn không phải đối phó với ma trận trống hoặc không.

Bạn có thể giả sử số nguyên sẽ không gây ra sự cố tràn.

Đầu ra:

Một giá trị nhất quán cho các ma trận hạng một và một giá trị nhất quán khác cho các ma trận khác.

Được xây dựng:

Bạn không được sử dụng bất kỳ tích hợp nào để tính thứ hạng hoặc trực tiếp kiểm tra thứ hạng một. Bạn có thể sử dụng các phần dựng sẵn khác như giá trị riêng, phân tách, v.v., nhưng tôi khuyến khích các câu trả lời nâng cao mà không có phần dựng sẵn làm hầu hết công việc.

Các trường hợp thử nghiệm:

Hạng một:

[[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]]

Không phải hạng một:

[[-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]]

Bảng xếp hạng:


2
Đối với người tò mò, một phản hồi Mathicala sử dụng nội dung sẽ giống như thế này (16 byte):MatrixRank@#==1&
JungHwan Min


2
Một định lý đẹp là thứ hạng cột bằng với thứ hạng hàng cho ma trận chiều hữu hạn.
Leaky Nun

3
Chúng ta có phải lo lắng về các vấn đề chính xác nổi? Chẳng hạn, họ có thể tạo ra ma trận hạng 1 có vẻ như xếp hạng 2
Luis Mendo

@LuisMendo Bạn phải xử lý các vấn đề chính xác như giá trị riêng là 1.0000000001, nhưng có thể giả sử ma trận không lớn và không được chọn cụ thể để phân loại sai.
xnor

Câu trả lời:


13

Thạch , 6 byte

ẸÐfÆrE

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ẸÐ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.

Độ chính xác

Ærsử dụng các phương pháp số, vì vậy kết quả của nó thường không chính xác. Ví dụ: đầu vào [6, -5, 1] , đại diện cho đa thức 6 - 5x + x² , dẫn đến các gốc 3.00000000000000041.9999999999999998 . Tuy nhiên, nhân tất cả các hệ số của một đa thức với cùng một hằng số khác không dẫn đến các gốc không chính xác như nhau. Ví dụ: Ærcó được các gốc giống nhau cho [6, -5, 1][6 × 10 100 , -5 × 10 100 , 10 100 ] .

Cần lưu ý rằng độ chính xác hạn chế của phaocác loại phức tạp có thể dẫn đến lỗi. Ví dụ: Ærsẽ có được các gốc giống nhau cho [1, 1][10 100 , 10 100 + 1] . Vì chúng ta có thể giả sử ma trận không lớn và không được chọn cụ thể để phân loại sai , điều đó sẽ ổn.


5
nhân tất cả các hệ số của một đa thức với cùng một hằng số khác không dẫn đến các gốc không chính xác như nhau Đó là một cách tiếp cận tuyệt vời
Luis Mendo

8

Haskell , 50 byte

rlấy một danh sách các danh sách Integers và trả về Falsenếu ma trận có thứ hạng, Truenếu không.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  • Tạo tất cả các cặp hàng ab(bao gồm các hàng bằng nhau) và cho mỗi cặp, cho phép xychạy qua các phần tử tương ứng.
  • Nhân số hàng btheo xvà hàng atheo y. Ma trận sẽ có thứ hạng một khi và chỉ khi kết quả luôn bằng nhau.
  • Vì các cặp được tạo trong cả hai đơn đặt hàng, <có thể được sử dụng để kiểm tra xem có bao giờ bất đẳng thức không. Danh sách kết quả kiểm tra được kết hợp với or, đưa ra Truenếu có bất kỳ hàng không tỷ lệ nào.

7

Toán học, 51 33 byte

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

Đầu vào

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

-14 byte từ user202729 Thêm
3 byte được lưu từ junghwanmin


Tôi đề nghị rằng, thay vì xây dựng một bảng có độ dài bằng First@#, bạn có thể tính toán 0First@#vì 0 nhân với mọi thứ là 0 và phép nhân có thể liệt kê được. Ngoài ra, bạn có thể xem xét sử dụng Tr[1^<list>]để tính toán độ dài của danh sách.
dùng202729

Rất đẹp. Tôi sẽ chỉnh sửa!
J42161217

Thay vì 0#&@@#, {0..}sẽ làm việc quá. Và sau đó Infixhoạt động, vì vậy mã cuối cùng có thể RowReduce@#~Count~{0..}==Tr[1^#]-1&, tiết kiệm 2 byte.
JungHwan Min

Trên thực tế, Exceptcó thể được sử dụng để loại bỏ các Trcông cụ. -3 byte:RowReduce@#~Count~Except@{0..}==1&
JungHwan Min

Tôi nghĩ rằng ma trận giảm hàng được đảm bảo là khác không (vì ma trận gốc là khác không), do đó kết quả đếm sẽ là một số nguyên dương, do đó <2có thể được sử dụng thay vì ==1.
dùng202729

4

JavaScript (ES6), 68 67 65 byte

Câu hỏi này dựa trên câu trả lời 05AB1E của Neil và hiệu quả hơn đáng kể so với cách tiếp cận ban đầu của tôi.

Trả về falsecho hạng một và mặt truekhác.

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

Các trường hợp thử nghiệm


Câu trả lời gốc, 84 byte

Trả về falsecho hạng một và mặt truekhác.

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))

Các trường hợp thử nghiệm

Làm sao?

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()

Phép trừ được thực hiện ở cuối mã có thể dẫn đến nhiều tình huống khác nhau, được tóm tắt dưới đây:

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

Thử nghiệm thất bại ngay khi chúng tôi nhận được giá trị trung thực: điều này xảy ra khi chúng tôi gặp hai tỷ lệ riêng biệt (khác 0/0 ) giữa a (i, y)a (i, r) trong bất kỳ hàng y nào của ma trận, trong đó r là chỉ số của một hàng khác không.


Huh, tôi chỉ tự hỏi rằng bản thân mình ...
Neil

@Neil Bạn có muốn đăng nó dưới dạng câu trả lời mới không? Hãy cho tôi biết.
Arnauld


3

Thạch , 12 byte

ẸÐfµ÷"ЀZE€Ẹ

Hãy thử trực tuyến!

Giải trình

ẸÐ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?

Giải thích có thể hơi không chính xác vì đây là cách giải thích của tôi về môn đánh gôn của thuật toán ban đầu của tôi

-5 byte nhờ dặm


... Mã của bạn nghiện tiền. (Tôi đang nhận deja vu ...)
hoàn toàn là

@icrieverytim Này ít nhất số ký hiệu đô la ít hơn một nửa chiều dài của mã lần này! : P
HyperNeutrino

1
@icrieverytim đã sửa một lỗi và bây giờ thậm chí còn ít ký hiệu đô la hơn: P
HyperNeutrino

Tôi tin rằng điều này sẽ làm việc quá 12 byte ẸÐfµ÷"ЀZE€Ẹ TIO
dặm

@miles ơi! Cách tiếp cận của bạn hơi khác một chút (tôi nghĩ vậy?) Để bạn có thể đăng bài đó dưới dạng câu trả lời của riêng bạn về bạn thích :)
HyperNeutrino

3

05AB1E , 16 byte

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

Hãy thử trực tuyến! Sử dụng thuộc tính bảng nhân mà các góc đối diện của bất kỳ hình chữ nhật nào có cùng một sản phẩm. Giải trình:

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 (sê-ri TI-83), 28 27 28 byte (62 ký tự)

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

Tính toán hình thức hàng của ma trận [A], lưu trữ hàng đầu tiên (sẽ bị loại bỏ) L₁và hàng thứ hai của nó trong ᶫX. Khi đó max(abs(ᶫXsẽ là 0 nếu ᶫXchỉ bao gồm các số 0 và giá trị dương khác, sẽ not(thay đổi thành 1 nếu ma trận được xếp hạng một, 0 nếu không.

Đối với ma trận 1 hàng, ᶫXđược đặt thành {0}và sau đó không bị thay đổi khi chúng ta cố gắng xem hàng thứ hai không tồn tại của ma trận.


-1 byte nhờ Scott Milner

+1 byte để sửa lỗi kích thước cho ma trận 1 hàng. Hóa ra Matr►list( lệnh phàn nàn nếu bạn cố trích xuất hàng thứ hai từ một ma trận chỉ có một hàng; tuy nhiên, nếu bạn cố trích xuất hàng thứ nhất và thứ hai cả hai từ ma trận, nó sẽ thất bại trong âm thầm.


1
Bạn có thể lưu một byte với Prompt [A]thay vì Ans→[A].
Scott Milner

@ScottMilner Cảm ơn! Có lẽ có một cách để tránh nếu chúng ta sử dụng một cái gì đó như ClrListđể khởi tạo ᶫX, nhưng tôi đã không hoàn toàn làm việc đó trong không gian ít hơn.
Misha Lavrov

Loại bỏ dòng thứ hai, vì Matr►list(sẽ ghi đè lên danh sách, ngay cả khi nó không tồn tại và bạn sẽ tiết kiệm được 5 byte.
kamoroso94

1
@ kamoroso94 Điểm của dòng thứ hai không tạo danh sách khi nó không tồn tại: điểm của dòng thứ hai là tạo giá trị mặc định cho hàng thứ hai khi ma trận chỉ có một hàng. Nếu bạn thoát khỏi dòng thứ hai, mã sẽ gặp sự cố đối với ma trận 1xN.
Misha Lavrov

2
@ kamoroso94 Chúng tôi sẽ phải thay thế L1 bằng ᶫY, không phải Y; mặt khác, máy tính sẽ nghĩ "trích xuất hàng Y-th của ma trận thành ᶫX", chứ không phải "trích xuất hàng đầu tiên thành ᶫY và hàng thứ hai thành ᶫX".
Misha Lavrov

3

Brachylog , 27 byte

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

Hãy thử trực tuyến!

Sử dụng cách tiếp cận của Neil về "các sản phẩm của các góc đối diện của mỗi hình chữ nhật phải bằng nhau". Sản phẩm chéo rất tốn kém và mất 10 byte, nhưng nó vẫn ngắn hơn bất kỳ cách tiếp cận dựa trên phân chia nào tôi đã thử, chủ yếu là do quy định của hai đầu ra nhất quán cho sự thật và falsey trong câu hỏi - làm cho falsey chỉ là một false., và đôi khi không phải là một lỗi chia cho 0, sử dụng quá nhiều byte.

{⊇Ċ}ᶠ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.)

Cách tiếp cận thay thế dựa trên phân chia phần tử khôn ngoan ( 30 byte ):

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

Hãy thử trực tuyến!



1

SageMath, 40 byte

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

Dùng thử trực tuyến

Hàm ẩn danh này trả về Falsenếu ma trận là hạng một, và Truengược lại.

Hàm lấy một ma trận Mlàm đầu vào, chuyển đổi nó thành dạng phản hồi hàng giảm ( M.rref()) và kiểm tra anycác hàng qua đầu tiên khác không. Sau đó, giá trị đó được nhân với M.nrows()>1(ma trận có nhiều hơn một hàng không?).


1

Python 3 , 93 91 byte

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))

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Kiểm tra nếu bất kỳ 2-nhỏ có xác định khác không. Nếu đây là trường hợp, thứ hạng phải có ít nhất 2: "Một p-junior không biến mất (p × p với hàm xác định khác không) cho thấy các hàng và cột của hàm con đó là độc lập tuyến tính, và do đó các hàng đó và các cột của ma trận đầy đủ là độc lập tuyến tính (trong ma trận đầy đủ), do đó thứ hạng hàng và cột ít nhất bằng thứ hạng xác định "(từ Wikipedia )

Lưu ý: đã cạo hai byte nhờ bình luận của user71546.


1
91 - ngắn hơn nếu đưa phép liệt kê vào các đối số hàm và do đó loại bỏ sự cần thiết của 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 Cảm ơn! Thực hiện nó!
Luca Citi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.