验证特征对


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结果向量中的-th值是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,我们说λ是对应于特征值vv对应于一个特征向量λ 当且仅当 Av = λv。(这里Av是矩阵矢量乘法,λv是标量乘法)。

(λ, v) 是一个本征对。

挑战规格

输入项

输入将包含一个矩阵,一个向量和一个标量。这些可以以任何合理格式的任何顺序进行。

输出量

输出将是真实/虚假值;当且仅当标量和向量是具有指定矩阵的本征对时,才为真。

规则

  • 适用标准漏洞
  • 如果您的语言中存在用于验证本征对的内置函数,则可能无法使用它。
  • 您可以假设所有数字都是整数

测试用例

 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

稍后再添加4x4。

不可读的测试用例,更易于测试



@MartinEnder谢谢。最初,我对任意大小的矩阵也遇到了类似的挑战,因为您打算为每个唯一的本征空间计算一个基础,但这仍然在沙箱中,因为它似乎太令人困惑了。
HyperNeutrino

如果输入的尺寸可能不是3x3,则应在测试用例中涵盖其中的一些尺寸。
Martin Ender

1
@HyperNeutrino是的,这无济于事...不要试图向我解释:我正在上高中,正在学习GCSE的数学,所以对我来说只是迷路了。
caird coinheringaahing

1
@ user00001如果您需要帮助,请使用本征对为您提供帮助。:P
mbomb007

Answers:


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不要将苹果与桔子相提并论。高尔夫语言每次操作只有一个字节,而普通语言很少有。规范具有三个运算(两个乘法和一个相等),并且允许一个额外的字节来复制v一个可能期望少至四个字节。
桑契斯'17

2
我喜欢Jelly和MATL如何使用两个字节进行矩阵乘法,这意味着这个答案确实表明Jelly在接受输入的条件下表现出色,其他所有条件都相同。
桑契斯'17


11

MATL,7个字节

*i2GY*=

输入顺序为:lvA

说明:

*  % 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添加了我自己的内容,以使前面的评论正确。(还是说真的??)
Sanchises'Apr 13'17

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中的数组变为假。


不知道的如falseyness的[true,false],谢谢你教我=)
flawr

1
@flawr见这个由Suever答案(这也适用于MATLAB)。基本上,一个几乎但并非相当(空矩阵[]是不同的)的隐式all()上调用的输入ifwhile等等
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如果所需的输出将需要truefalse而非truthy或falsey值。就挑战而言,==确实足够。
桑契斯'17

@HyperNeutrino它将返回一个包含两个向量逐元素比较的结果的向量。
Steadybox '17

哦好的。不错的答案!
HyperNeutrino

匿名函数会更短吗?
蝙蝠侠

2

C ++,225203字节

感谢@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::S,节省20
恢复莫妮卡-科特阿蒙

2
更好的using V=std::vector<float>;还是类似的
朱利安·沃尔夫


2

Python 2.7,33个字节

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

输入:m =矩阵,s =标量,e =特征值。M和s是numpy数组


2
这看起来不错,但我认为你需要包括的字节数import np为它是有效的
DJMcMayhem

1
你以前的print(m,s,e)声明不会工作,因为变量mse尚未分配/定义。另外,您可以删除冒号后的空格。另外,您可以删除`as n`部分,numpy以后再使用;由于只使用一次,因此使用全名实际上可以节省一个字节。
HyperNeutrino

1
好的我现在明白了。谢谢您的建议,每
一刻

2
它不应该是all不是any?我认为s是矢量,而不是标量,除非我丢失了某些东西
Luis Mendo

1
比较字符串表示形式甚至更短。tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…–
Dennis



1

R,30 25字节

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

匿名函数,相当简单。返回TRUEFALSE


0

OK,12个字节

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

这是一个函数,它带有[matrix;vector;scalar]

由于3.0~3给出的相同原因,这在k中不起作用0


The following works in k, with 14 bytes:

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

0

Axiom, 27 bytes

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

exercises

(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

I haven't seen this language before, nice answer! What does the @Boolean do?
HyperNeutrino

(a=b)@Boolean would mean "choose among allowed =operator(type1,type2) the one its result is Boolean"; in few words "a=b" has to be Boolean
RosLuP

0

Python, 26 bytes

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

a and b are numpy arrays, c is an integer.

Try it online!


2
Are the parens around c*b actually necessary?
xnor

@xnor thanks, fixed.
Rɪᴋᴇʀ

This only works for small arrays, since NumPy abridges large array string representations.
user2357112 supports Monica

@user2357112 example? I'm not sure what you mean.
Rɪᴋᴇʀ

If c*b has more than 1000 elements, NumPy will replace most of the elements with .... Demo.
user2357112 supports Monica

0

Clojure, 60 bytes

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

This checks that all deltas are zero, thus collapsing into the set of zero. Calling example:

(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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.