关于函数 transpose 和 E@p
根据函数文档描述,transpose(A) 用于计算矩阵 A 的转置,此时 A 必须是一个矩阵,如果 A 是一个不等长度的多层序列,用 transpose 转置算不算非法?因为转置结果有点意料之外。
比如,对序列 [[1],[2,3],[4,5,6]] 进行 transpose 之后,结果如下所示:
我原本猜想的结果是,转置之后,不等长的位置之处会用 null 代替,而公式显示的结果是用一个压缩序列填充了。这是函数原本设计成这样,还是说 (my two cents) 用 null 填充会更合适?我测试了一下,如果是矩阵转置,一百万行很快能出结果,如果是不等长序列转置,其中有一个是 100 万个元素,其它的元素个数不等,此时 transpose 效率低下甚至崩溃,因为它要把每个空缺的地方用序列去填充,所以开销很大,如果换成 null 填充会不会开销没那么大?这只是我毫无理论依据的猜想,不知道对不对。
对于转置,spl 还提供了一个函数 E@p,当然这个处理的不是矩阵,拿他作对比是为了说明一种效果。对上述同样的不等长序列用 E@bp 转置后,会生成一个没有表头的序表,结果如下:
可以看到,E@p 转置后把缺失的地方用 null 填充了,但结果是一个序表。这两种写法在集算器 IDE 里的得到结果和在 EXCEL 插件里得到的结果是一样的。
如果要把序列 [[1],[2,3],[4,5,6]] 变成序列[[1,2,4],[null,3,5],[null,null,6]],得到元素 zip 之后的效果,显然,
- transpose 是最直接的,但转置之后的结果有点不合适;
- 用 E@p 虽然能达到预期,但结果是一个序表,要变成序列还得再加一步,E@bp().array().m(2:);
-
或者用以下嵌套循环的写法,也不是很直接,需先计算出元素的最大长度:
恳请大佬得闲时指点一下,有没有直接一点的方法,fx_ 转置 (多层序列) 得到预期的结果。
谢谢!
transpose 函数在做转置处理时,如果矩阵不满时存在 bug,可能在无法获取某个位置的成员时设为原矩阵的整行数据,目前已修改。默认情况下,transpose 函数会在矩阵不满时,把空位设为 0,添加了 @n 选项,transpose@n 会在矩阵不满时保持 null。 需要更新 esproc-bin 的 jar 包使用。
谢谢大佬,大佬辛苦🙏
transpose 这个 bug 在 3 个月前就发现了,一直以为这种非矩阵转置属于我个人的不正常用法,也没好意思发帖求助。
但 transpose 转置时缺失的位置处复制了整行的内容,作为一个压缩序列填入,这个总感觉怪怪的,而且开销应该很大。
E@bp 虽然能作为一个 workaround,但转置序列来说总觉得不够直接。这个函数自有其它妙用。
所以,考虑再三,还是发帖求助了,感谢大佬,感谢 SPL🙏
BTW,jar 包更新了没,我下载下来试试😄😄
您好,jar 包已更新,请移步下载贴
谢谢大佬!
Works like magic…SPL YaoYao Ahead!👍 👍 👍