在 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
给定输入向量 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
我有一个 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
给定输入向量 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