首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >APL:矩阵操作技巧?

APL:矩阵操作技巧?
EN

Stack Overflow用户
提问于 2013-07-17 06:37:04
回答 2查看 1.1K关注 0票数 4

我正在尝试找到一种方法(惯用或其他方式)来转换一个看起来像这样的矩阵

代码语言:javascript
复制
0 1
0 1
0 1

分成3个独立矩阵

代码语言:javascript
复制
0 1
0 0
0 0

0 0
0 1
0 0

0 0
0 0
0 1

所以当我或者他们所有人在一起的时候,我得到了原件。这些“子矩阵”中的每个必须只有一个非零元素,并且必须与原始矩阵具有相同的形状。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-17 10:51:41

一种解决方案:

任意布尔矩阵:

代码语言:javascript
复制
      m←4 3⍴?12⍴2
      m
0 0 1
0 0 0
1 1 0
0 1 0

注意它的形状:

代码语言:javascript
复制
    d←⍴m
    d
4 3

将矩阵分解为向量:

代码语言:javascript
复制
      v←,m
      v
0 0 1 0 0 0 1 1 0 0 1 0

生成索引:

代码语言:javascript
复制
          i ←⍳⍴v
          i
    0 1 2 3 4 5 6 7 8 9 10 11

为原始矩阵中的每个1构造一个矩阵:

代码语言:javascript
复制
      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 

验证结果:

代码语言:javascript
复制
   ↑∨/a
0 0 1
0 0 0
1 1 0
0 1 0

使用散点索引可能有一个很好的方法来实现这一点,首先生成一个3维矩阵,然后指定1的位置。

是的,使用v和d如下所示:

代码语言:javascript
复制
       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
票数 3
EN

Stack Overflow用户

发布于 2013-07-17 20:30:23

给定一个向量A:

代码语言:javascript
复制
+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

将其分解为组件矩阵,如下所示:

代码语言:javascript
复制
+(⍴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:

代码语言:javascript
复制
B←+/,A          ⍝ 5

创建一个单位矩阵,如本文所述:The most idiomatic way of creating identity matrix in APL

代码语言:javascript
复制
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

对原始矩阵进行拆分:

代码语言:javascript
复制
,A              ⍝ 1 0 1 0 1 0 0 0 0 1 0 1

使用分解后的矩阵来扩展单位矩阵。这创建了一个矩阵,其中每一行都是分量矩阵的分解形式:

代码语言:javascript
复制
+(,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

将该矩阵转换为行的向量:

代码语言:javascript
复制
+⊂[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)的原始形状,创建最终矩阵:

代码语言:javascript
复制
(⍴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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17688146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档