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

时间:2017-12-28 16:17:56

标签: j apl

我有一个我在1985年写的J程序(在vax vms上)。一节是从矢量创建对角矩阵。

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

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

5 个答案:

答案 0 :(得分:6)

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

a=.(n,n)$1,n$0
b=.i.n
a=.b*a

Try it online!但是,没有APL(截至目前 - 正在考虑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!

答案 1 :(得分:3)

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

      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

答案 2 :(得分:1)

给定输入向量X,以下内容适用于所有APL(由@Adámin 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

答案 3 :(得分:0)

或另一种方式:

(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

答案 4 :(得分:0)

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

base_path = '/path/to/dir'

for i in range(10):
    dir_path = '{}/s{}'.format(base_path, i)
    os.makedirs(dir_path)
    for j in range(10):
        file_path = '{}/s{}.png'.format(dir_path, j)
        # your logic with file