我有一个我在1985年写的J程序(在vax vms上)。一节是从矢量创建对角矩阵。
a=(n,n)R1,nR0
b=In
a=bXa
也许它不是J而是ascii中的APL,但这些行在当前的J中起作用(在原始函数中有适当的变化)。但不是APL(gnu,NARS2000或ELI)。我在最后一行收到域错误。 有没有循环的简单方法呢?
答案 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
答案 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