作为2018年5月每月语言活动的一部分,此挑战与MATL语言的某些功能有关。
介绍
在MATL中,许多双输入功能与broadcast一起逐个元素地工作。这意味着:
逐元素(或向量化):该函数将具有匹配大小的两个数组作为输入。该功能定义的操作将应用于每对对应的条目。例如,使用后缀表示法:
[2 4 6] [10 20 30] +
给出输出
[12 24 36]
这也适用于多维数组。符号
[1 2 3; 4 5 6]
表示2
×3
数组(矩阵)1 2 3 4 5 6
2
沿第一个尺寸(垂直)和3
沿第二个尺寸(水平)具有尺寸。所以举个例子[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
广播或(单例扩展):两个输入数组没有匹配的大小,但是在每个不匹配的维度中,其中一个数组具有size
1
。该数组沿其他维度隐式复制,以使大小匹配;然后按上述元素操作方式进行操作。例如,考虑两个具有1
×2
和3
× 大小的输入数组1
:[10 20] [1; 2; 5] /
多亏了广播,这相当于
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
所以它给
[10 20; 5 10; 2 4]
同样,使用
3
×2
和3
×1
(现在广播仅沿第二维起作用),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
尺寸的数量甚至可以不同。例如,大小为3×2和3×1×5的输入是兼容的,并给出3×2×5的结果。实际上,大小3×2与3×2×1相同(存在许多隐式尾随单例尺寸)。
另一方面,一对
2
×2
和3
×1
数组会产生错误,因为沿第一维的大小为2
和3
:它们不相等,并且都不是1
。
模块化广播的定义
模块化广播是对广播的概括,即使不匹配的大小都不为,广播也可以工作1
。例如,考虑以下2
× 2
和3
× 1
数组作为函数的输入+
:
[2 4; 6 8] [10; 20; 30] +
规则如下:对于每个维度,将模块化(循环)复制沿该维度较小的数组,以匹配另一个数组的大小。这将使以上内容等同于
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
结果
[12 14; 26 28; 32 34]
再举一个例子
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
会产生
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
通常,大小为a
× b
和c
×的输入d
给出大小为max(a,b)
× 的结果max(c,d)
。
挑战
实施除了用于二维与阵列模块化广播如上定义。
数组将是矩形的(不参差不齐),将仅包含非负整数,并且至少1
在每个维度上均具有大小。
附加规则:
测试用例
以下内容;
用作行分隔符(如上例所示)。每个测试用例都显示两个输入,然后显示输出。
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
1
× n
(例如[1 2 3]
)或n
× 1
(例如[1; 2; 3]
)的二维