bri*_*foy 9 slice multidimensional-array perl6
我可以制作一个形状(固定大小)的数组:
my @array[3;3] = (
< 1 2 3 >,
< 4 5 6 >,
< 7 8 9 >
);
say @array; # [[1 2 3] [4 5 6] [7 8 9]]
say @array[1;1]; # 5
Run Code Online (Sandbox Code Playgroud)
如何切片以获得我想要的任何特定列或对角线(行很容易)?
如何将每个维度中的索引列表转换为正确的方括号?
而且,肯定有一些花哨的语法可以阻止我做一些复杂的事情:
my @diagonal = gather {
my @ends = @array.shape.map: { (0 ..^ $^a).List };
for [Z] @ends {
take @array[ $_ ] # how do I make that $_[0];$_[1];...
};
}
Run Code Online (Sandbox Code Playgroud)
如何切片以获得我想要的任何特定列或对角线?
据我所知,你现在不能使用形状数组的切片语法(尽管你的"(行很容易)"评论,这使我对你的帖子的评论感到困惑).
显而易见的解决方案是删除形状并使用切片语法:
my @array = ( < 1 2 3 >, < 4 5 6 >, < 7 8 9 > );
say @array[1]; # 4 5 6 (second row)
say @array[1;*]; # same
say @array[*;1]; # 2 5 8 (second column)
Run Code Online (Sandbox Code Playgroud)
如果你想保留使用形状数组的边界检查安全性(和/或形状原生数组的C数组兼容性,如果我是对的那样)那么你可能必须保留数组的两个副本周围,使用一个保持形状阵列的所需方面,另一个切片.
如何将每个维度中的索引列表转换为正确的方括号?
最终叶子之前的每个维度切片必须与a分开;.
我还不清楚这是因为它;是一个语句分隔符(在下标中)还是列表列表指示符,也不知道如何以编程方式将索引列表转换为该表单.(调查仍在继续.)
并且,肯定有一些花哨的语法可以阻止我做一些复杂的事情[对角切片]:
say @array[*;{$++}]; # 1 5 9 (diagonal)
Run Code Online (Sandbox Code Playgroud)
数组下标中的第一个;分隔字段[...]对应于数组中的第一个维度,即数组中的行.
指定*要包含所有行的方法,而不是指定特定的行.
最后一个字段对应于下标的叶子,即要访问的实际元素.
我首先尝试的只是$++而不是{$++}但是这给了我所有元素的第0列,大概是因为语言/ roast和/或Rakudo仅在下[...]标运算符的每次调用时评估标量索引值.
然后我推断如果索引是Callable,它将被调用,并且每行可能调用一次.这很有效.
我认为这与Rakudo中的此代码相对应.
乍一看,这似乎意味着你不能使用a Callable来计算叶片,我注意到"计算指数"的烘焙切片不包括使用a Callable.也许我只是没有正确看待它.
您可能已经看到,这会返回一个尚未实现的错误(插入该错误是为了解决此错误;
Partially dimensioned views of shaped arrays not yet implemented. Sorry.
Run Code Online (Sandbox Code Playgroud)
在这种情况下,最好只是取消数组的形状并使用更传统的方法:
use v6;
my @array = (
< 1 2 3 >,
< 4 5 6 >,
< 7 8 9 >
);
my @diagonal = gather {
my @ends = ((0,0),(1,1),(2,2));
for @ends -> @indices {
take @array[ @indices[0] ][@indices[1]];
};
}
say @diagonal;
Run Code Online (Sandbox Code Playgroud)
通过查看该主题的概要,我想说该方法并未真正指定。因此,当一切都说了又做了之后,您可能必须使用 或EVAL宏(当然,当它们最终实现时......)