在 APL 中,如何将向量(长度为 n)转换为对角矩阵(nxn)?

in APL how do I turn a vector (of length n) into a diagonal matrix (nxn)?

我有一个 1985 年写的 J 程序(在 vax vms 上)。其中一部分是从向量创建对角矩阵。

a=(n,n)R1,nR0
b=In
a=bXa

也许它不是 J,而是 ascii 中的 APL,但这些行在当前的 J 中有效(对原始函数进行了适当的更改)。但不是在 APL(gnu、NARS2000 或 ELI)中。我在最后一行收到域错误。 有没有不用循环的简单方法?

您的代码是 APL 的 ASCII 音译。对应的J码为:

a=.(n,n),n[=10=]
b=.i.n
a=.b*a

Try it online! However, no APL (as of yet — it is being considered for Dyalog APL) 具有最后一行所需的主要单元格扩展名。因此,您需要使用括号轴表示法指定向量 b 的标量应与矩阵 a 的行相乘:

a←(n,n)⍴1,n⍴0
b←⍳n
a←b×[1]a

Try it online! 或者,您可以使用排名运算符(如果可用):

a←(n,n)⍴1,n⍴0
b←⍳n
a←b(×⍤0 1)a

Try it online!

给定输入向量 X,以下适用于所有 APL,(由@Adám in chat 提供):

(2⍴S)⍴((2×S)⍴1,-S←⍴X)\X

并且 here 是您可以在线 运行 的地方。

这是我使用乘法和外积(后者导致低效率)的低效旧版本:

((⍴Q)⍴X)×Q←P∘.=P←⍳⍴X
((⍴Q)⍴X)×Q←P Pρ1,(P←≢X)ρ0

一个更优雅的解决对角线的方法是 ⍉ 重复轴:

      n←5 ◊ z←(n,n)⍴0 ◊ (1 1⍉z)←⍳n ◊ z
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5

或另一种方式:

(n∘.=n)×(2ρρn)ρn←⍳5

应该在大多数 APL 中为您提供以下内容

1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5

此解决方案适用于旧的 ISO Apl:

a←(n,n)⍴v,(n,n)⍴0