Перевірте Eigenpairs


21

У цьому виклику вам дадуть квадратну матрицю A, вектор vта скаляр λ. Вам потрібно буде визначити, чи (λ, v)відповідає власне пара A; тобто чи ні Av = λv.

Точковий продукт

Точковий добуток двох векторів - це сума множення елементів. Наприклад, крапковий добуток наступних двох векторів:

(1, 2, 3) * (4, 5, 6) = 1*4 + 2*5 + 3*6 = 32

Зауважте, що крапковий добуток визначається лише між двома векторами однакової довжини.

Матричне-векторне множення

Матриця - це 2D сітка значень. Матриця mx nмає mрядки та nстовпці. Ми можемо уявити матрицю mx nяк mвектори довжини n(якщо взяти рядки).

Множення матричного вектора визначається між матрицею mx nта nвектором розміру . Якщо помножити матрицю mx nі nвектор розміру , отримаємо mвектор розміру . Значення i-го у векторі результатів - це крапковий добуток i-го рядка матриці та вихідний вектор.

Приклад

        1 2 3 4 5
Let A = 3 4 5 6 7
        5 6 7 8 9

        1
        3
Let v = 5
        7
        9

Якщо помножити матрицю і вектор Av = x, отримаємо наступне:

x 1 = A T 1 * v /* AT1 means the first row of A; A1 would be the first column */= (1,2,3,4,5) * (1,3,5,7,9) = 1 * 1 + 2 * 3 + 3 * 5 + 4 * 7 + 5 * 9 = 1 + 6 + 15 + 28 + 45 = 95

x 2 = A T 2 * v = (3,4,5,6,7) * (1,3,5,7,9) = 3 * 1 + 4 * 3 + 5 * 5 + 6 * 7 + 7 * 9 = 3 + 12 + 25 + 42 + 63 = 145

x 3 = A T 3 * v = (5,6,7,8,9) * (1,3,5,7,9) = 5 * 1 + 6 * 3 + 7 * 5 + 8 * 7 + 9 * 9 = 5 + 18 + 35 + 56 + 81 = 195

Отже, ми отримуємо Av = x = (95, 145, 195).

Скалярне множення

Множення скаляра (одиничне число) і вектора - це просто елементне множення. Наприклад, 3 * (1, 2, 3) = (3, 6, 9). Це досить просто.

Власні значення та власні вектори

Враховуючи матрицю A, ми говоримо, що λце власне значення, що відповідає, vі vє власним вектором, що відповідає, λ якщо і тільки якщо Av = λv . (Де Avє множення матричного вектора і λvскалярне множення).

(λ, v) є власним паролем.

Технічні характеристики

Вхідні дані

Введення складається з матриці, вектора та скаляра. Вони можуть бути прийняті в будь-якому порядку в будь-якому розумному форматі.

Вихідні дані

Результатом буде значення "химерність / хибність"; truthy тоді і лише в тому випадку, якщо скаляр і вектор - це власне значення з вказаною матрицею.

Правила

  • Застосовуються стандартні лазівки
  • Якщо у вашій мові існує вбудована версія для підтвердження власного паролю, ви можете не використовувати її.
  • Ви можете припустити, що всі числа є цілими числами

Випробування

 MATRIX  VECTOR  EIGENVALUE
 2 -3 -1    3
 1 -2 -1    1    1    ->    TRUE
 1 -3  0    0

 2 -3 -1    1
 1 -2 -1    1    -2   ->    TRUE
 1 -3  0    1

 1  6  3    1
 0 -2  0    0    4    ->    TRUE
 3  6  1    1

 1  0 -1    2
-1  1  1    1    7    ->    FALSE
 1  0  0    0

-4 3    1    
 2 1    2    2    ->    TRUE

2    1    2    ->    TRUE

Пізніше додам 4х4.

Нечитабельні тестові випадки, простіші для тестування



@MartinEnder Дякую Я спочатку мав подібний виклик для матриць довільного розміру, де ви мали на меті обчислити основу для кожного унікального власного простору, але це все ще в пісочниці, оскільки це здається занадто заплутаним.
HyperNeutrino

Якщо входи можуть мати інші розміри, ніж 3x3, ви повинні охопити деякі з них у своїх тестових випадках.
Мартін Ендер

1
@HyperNeutrino Так, це не допомагає ... Не намагайтеся пояснити це мені: я в середній школі вивчаю математику для GCSE, тому її просто втратили на мені.
caird coinheringaahing

1
@ user00001 Якщо вам потрібна допомога, eigenpair - підкажіть її для вас. : P
mbomb007

Відповіді:


11

Желе , 5 байт

æ.⁵⁼×

Це тріада, повна програма.

Спробуйте в Інтернеті!

Як це працює

æ.⁵⁼×  Main link
       Left argument:  v (eigenvector)
       Right argument: λ (eigenvalue)
       Third argument: A (matrix)

  ⁵    Third; yield A.
æ.     Take the dot product of v and A, yielding Av.
    ×  Multiply v and λ component by component, yielding λv.
   ⁼   Test the results to the left and to the right for equality.

> _> це занадто коротко: P Приємна відповідь
HyperNeutrino

6
Це божевільна розмова! : P
Денніс

Ти щось пишеш і думаєш, "нічого коротше не могло бути!". Потім MATL приходить разом і вдвічі зменшує розмір коду. Тоді Джеллі приходить разом і половинки, що> _>
HyperNeutrino

@HyperNeutrino Не порівнюйте яблука з апельсинами. Мови для гри в гольф мають лише один байт на операцію, щось нормальне для мов рідко. Спекуляція має три операції (два множення і рівність), і для отримання додаткового байту для дублювання vможна очікувати всього чотири байти.
Санчіз

2
Мені подобається, як і Jelly, і MATL використовують два байти для множення матриці, а це означає, що ця відповідь дійсно показує, наскільки добре Jelly сприймає дані, а всі інші рівні.
Санчіз

13

Математика, 10 байт

#2.#==#3#&

Здійснює вхід як {vector, matrix, scalar}і повертає булеве значення.


1
> _> Це було занадто просто для Mathematica. +1: P
HyperNeutrino

9
@HyperNeutrino А тепер ми чекаємо MATL ...
Мартін Ендер

2
Ну MATL з'явився> _>
HyperNeutrino

1
Один з тих моментів, коли ти думаєш, що нічого не може бути коротшим і MATL спливе раптово :)
Містер Xcoder

@ Mr.Xcoder І тоді з'являється Джеллі.
Steadybox

11

MATL, 7 байт

*i2GY*=

Входи в порядку: l, v, A.

Пояснення:

*  % implicitly get l and v, multiply.
i  % get A
2G % get second input, i.e., v again
Y* % perform matrix multiplication
=  % test equality of both multiplications

Напрочуд довга відповідь, якщо ви запитаєте мене, головним чином тому, що мені потрібен був спосіб, щоб правильно отримати всі дані. Я не думаю, що можливо менше 5 байт, але було б здорово, якби хтось знайшов рішення з 5 або 6 байтами.

В основному, це обчислює l*v==A*v.


"Дивно довго", я очікував, щонайменше, 20 байт> _> приємна відповідь, хоча: P
HyperNeutrino

2
Ну, враховуючи, що відповідь MATLAB надійде в 16 байт @(A,v,l)A*v==v*l, це здається досить багатослівним, і я маю відчуття, що 6 повинно бути багато, якщо я отримаю вклад дещо розумніший.
Санчіз

Мабуть, він увійшов у 38 байт, але я впевнений, що його можна покатати.
HyperNeutrino

3
@HyperNeutrino Додав власне, щоб зробити попередній коментар правдивим. (або триут ...?)
Санчіз

6

CJam , 15 байт

q~W$f.*::+@@f*=

Бере введення у формі vector scalar matrix.

Спробуйте в Інтернеті!

Пояснення

q~               e# Read and eval the input
  W$             e# Copy the bottom most value (the vector)
    f.*::+       e# Perform element-wise multiplication with each row of the matrix, then
                 e#   sum the results of each (ie dot product with each row) 
          @@     e# Move the resulting vector to the bottom of the stack
            f*   e# Element-wise multiplication of the scalar and the vector
              =  e# Check if the two vectors are equal

5

MATLAB, 16 байт

@(A,v,l)A*v==v*l

Досить тривіальна відповідь. Визначає анонімну функцію, що приймає вхідні дані, і обчислює елементну рівність отриманих векторів. Один нуль в логічному масиві робить фальсию масиву в MATLAB.


Не знав про помилковість, наприклад [true,false], спасибі за те, що мене навчали =)
недолік

1
@flawr Дивіться цю відповідь від Suever (що також стосується MATLAB). В принципі, майже-но-ні-зовсім (порожня матриця []відрізняється) неявно all()викликається на вході if, і whileт.д.
Sanchises

2

MATLAB, 38 байт

function r=f(m,v,s);r=isequal(m*v,s*v)

Повертає 1 або 0.

MATLAB, 30 байт

function r=f(m,v,s);r=m*v==s*v

Повертається

1
1
1

як ціннісна цінність. Неправдиве значення - аналогічний вектор з будь-яким або всіма значеннями 0 замість 1.


Я не знаю MATLAB, але чи можна цю isequalфункцію скоротити ==?
HyperNeutrino

1
@HyperNeutrino isequalзнадобиться, якщо потрібен вихід trueабо falseзамість того, щоб мати значення "truthy" або "falsey". Як виклик стоїть, ==насправді достатньо.
Санчіз

@HyperNeutrino Він би повернув вектор, що містить результати поелементного порівняння двох векторів.
Steadybox

О, гаразд. Хороша відповідь, хоча!
HyperNeutrino

хіба анонімна функція не буде коротшою?
Бетмен

2

C ++, 225 203 байт

Дякуємо @Cort Ammon та @Julian Wolf за збереження 22 байтів!

#import<vector>
#define F(v,i)for(i=0;i<v.size();++i)
using V=std::vector<float>;int f(std::vector<V>m,V v,float s){V p;int i,j;F(m,i){p.push_back(0);F(v,j)p[i]+=v[j]*m[i][j];}F(v,i)v[i]*=s;return v==p;}

Спробуйте в Інтернеті!


1
using std::vector;міг би гольф на два байти від цього. Він коштує 18 байт, але може видалити 4 std::секунди, заощаджуючи 20.
Корт Аммон - Відновіть Моніку

2
ще краще, using V=std::vector<float>;або подібне
Julian Wolf


2

Python 2.7, 33 байти

f=lambda m,s,e:all(m.dot(s)==e*s)

вхід: m = матриця, s = скалярний, e = власне значення. M і s - масивні масиви


2
Це виглядає добре, але я думаю, вам потрібно включити кількість байтів, import npщоб це було дійсним
DJMcMayhem

1
Ваше попереднє print(m,s,e)заява не буде працювати , так як змінні m, sі eще не були призначені / виразно. Також ви можете видалити простір після двокрапки. Крім того, ви можете видалити частину `як n` і просто використовувати її numpyзгодом; оскільки ви використовуєте його лише один раз, використання повного імені фактично економить байт.
HyperNeutrino

1
Гаразд, я зараз розумію. Дякую за пропозиції, стискаючи кожен шматочок :)
HonzaB

2
Чи не повинно бути allзамість цього any? І я думаю s, що вектор, а не скаляр, якщо я щось не пропускаю
Луїс Мендо

1
Ще коротше було б порівняти рядкові подання. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…
Денніс

2

Python 3 , 96 70 байт

Немає вбудованих для множення матричного або скалярного вектора!

lambda A,L,v:all(L*y==sum(i*j for i,j in zip(x,v))for x,y in zip(A,v))

Спробуйте в Інтернеті!

-26 байт, використовуючи zipзавдяки @LeakyNun!




1

R, 30 25 байт

s=pryr::f(all(a%*%v==λ*v))

Анонімна функція, досить проста. Повертається TRUEабо FALSE.


0

oK, 12 байт

{y~z%+/y*+x}

Це функція, вона бере на себе [matrix;vector;scalar].

Це не працює в до по тимі ж причинам , що 3.0~3дає 0в результаті.


Наступні роботи в k , з 14 байтами :

{(y*z)~+/y*+x}

0

Аксіома, 27 байт

f(a,b,c)==(a*b=c*b)@Boolean

вправи

(17) -> m:=matrix[[2,-3,-1],[1,-2,-1],[1,-3,0] ]; v:=matrix[[3],[1],[0]];
(18) -> f(m,v,1)
   (18)  true

(19) -> m:=matrix[[2,-3,-1],[1,-2,-1],[1,-3,0] ]; v:=matrix[[1],[1],[1]];
(20) -> f(m,v,-2)
   (20)  true

(21) -> m:=matrix[[1,6,3],[0,-2,0],[3,6,1] ]; v:=matrix[[1],[0],[1]];
(22) -> f(m,v,4)
   (22)  true

(23) -> m:=matrix[[1,0,-1],[-1,1,1],[1,0,0] ]; v:=matrix[[2],[1],[0]];
(24) -> f(m,v,7)
   (24)  false

(25) -> m:=matrix[[-4,3],[2,1] ]; v:=matrix[[1],[2]];
(26) -> f(m,v,2)
   (26)  true

(27) -> f(2,1,2)
   (27)  true

Я ще не бачив цієї мови, приємна відповідь! Що робить @Boolean?
HyperNeutrino

(a = b) @Boolean означатиме "вибрати серед дозволених = оператор (type1, type2), результатом якого є булева"; у кількох словах "a = b" має бути булевим
RosLuP

0

Пітон, 26 байт

lambda a,b,c:c*b==a.dot(b)

aі bє нумерованими масивами, cце ціле число.

Спробуйте в Інтернеті!


2
Чи c*bсправді потрібні парени навколо ?
xnor

@xnor спасибі, виправлено.
Rɪᴋᴇʀ

Це працює лише для малих масивів, оскільки NumPy скорочує представлення великих рядків масиву.
user2357112 підтримує Моніку

@ user2357112 Приклад? Я не впевнений, що ти маєш на увазі.
Rɪᴋᴇʀ

Якщо c*bмає більше 1000 елементів, NumPy замінить більшість елементів на .... Демо
user2357112 підтримує Моніку

0

Clojure, 60 байт

#(=(set(map(fn[a v](apply -(* v %3)(map * a %2)))% %2))#{0})

Це перевіряє, що всі дельти дорівнюють нулю, тим самим згортаючись у множину нуля. Приклад виклику:

(def f #(=(set(map(fn[a v](apply -(* v %3)(map * a %2)))% %2))#{0}))
(f [[1 6 3][0 -2 0][3 6 1]] [1 0 1] 4)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.