我正在尝试找到一种方法(惯用或其他方式)来转换一个看起来像这样的矩阵
0 1
0 1
0 1分成3个独立矩阵
0 1
0 0
0 0
0 0
0 1
0 0
0 0
0 0
0 1所以当我或者他们所有人在一起的时候,我得到了原件。这些“子矩阵”中的每个必须只有一个非零元素,并且必须与原始矩阵具有相同的形状。
发布于 2013-07-17 10:51:41
一种解决方案:
任意布尔矩阵:
m←4 3⍴?12⍴2
m
0 0 1
0 0 0
1 1 0
0 1 0注意它的形状:
d←⍴m
d
4 3将矩阵分解为向量:
v←,m
v
0 0 1 0 0 0 1 1 0 0 1 0生成索引:
i ←⍳⍴v
i
0 1 2 3 4 5 6 7 8 9 10 11为原始矩阵中的每个1构造一个矩阵:
a←d∘⍴¨↓(v/i)∘.=i
a
0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 验证结果:
↑∨/a
0 0 1
0 0 0
1 1 0
0 1 0使用散点索引可能有一个很好的方法来实现这一点,首先生成一个3维矩阵,然后指定1的位置。
是的,使用v和d如下所示:
n←+/v
b←(n,d)⍴0
b[↓⍉(⍳n)⍪d⊤v/⍳⍴v]←1
b
0 0 1
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 0 0
0 0 0
0 0 0
0 0 0
0 1 0
0 0 0
0 0 0
0 0 0
0 0 0
0 1 0
∨⌿b
0 0 1
0 0 0
1 1 0
0 1 0发布于 2013-07-17 20:30:23
给定一个向量A:
+A←3 4⍴1 0 1 0 1 0 0 0 0 1 0 1
1 0 1 0
1 0 0 0
0 1 0 1将其分解为组件矩阵,如下所示:
+(⍴A)∘⍴¨⊂[2](,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1如何工作
首先将1的数量分配给B:
B←+/,A ⍝ 5创建一个单位矩阵,如本文所述:The most idiomatic way of creating identity matrix in APL
B B⍴1,(B←+/,A)⍴0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1对原始矩阵进行拆分:
,A ⍝ 1 0 1 0 1 0 0 0 0 1 0 1使用分解后的矩阵来扩展单位矩阵。这创建了一个矩阵,其中每一行都是分量矩阵的分解形式:
+(,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1将该矩阵转换为行的向量:
+⊂[2](,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1使用A (⍴A)的原始形状,创建最终矩阵:
(⍴A)∘⍴¨⊂[2](,A)\B B⍴1,(B←+/,A)⍴0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1https://stackoverflow.com/questions/17688146
复制相似问题