0

我无法添加两个不同大小的数组。当我在这个站点上进行一些探索时,似乎大多数问题都涉及不同大小的向量,而不是行和列中具有多个维度的实际矩阵。

我知道添加不同维度的矩阵在数学上“没有意义”。这只是我用来简化代码工作的工具,但问题是:

A = magic(4);
B = magic(3);
C = A + B

这基本上就是我想要做的。我只想让 B 在第 4 行和第 4 列有零,然后我可以有相同的尺寸并添加它们。但是我该怎么做呢?提前感谢=)

编辑:另外,特别是我想以某种方式将 B 添加到 A 中,因此来自 A 的原始 3x3 基本上“移动”了 1 列但保持在同一行。

4

3 回答 3

3

在添加 A 和 B 之前用零填充数组 B。使用函数“padarray”

于 2013-07-15T12:58:53.707 回答
3

请注意,padarray需要安装图像处理工具箱。

涉及填充的本机解决方案如下所示:

C = B;
C(end + 1:size(A, 1), end + 1:size(A, 1)) = 0;
C = C + A;

这假设矩阵A的维度大于B,但如果不是,您可以轻松修改此代码。

填充的替代方法是将矩阵添加BA. 这可以通过多种方式实现,例如:

C = zeros(max(size(A), size(B)));  %// Preallocate matrix to accommodate result
C(1:size(A, 1), 1:size(A, 2)) = A;
C(1:size(B, 1), 1:size(B, 2)) = C(1:size(B, 1), 1:size(B, 2)) + B;

此特定示例计算矩阵A和中元素的索引,并对重叠元素求和。BC

于 2013-07-15T13:17:51.297 回答
1

假设A可能会被破坏性地重复使用,您也可以通过直接索引到A. 这节省了一个依赖项 ( padarray) 并将内存复杂度降低到O(N)(而不是O(N²)forpadarray或手动填充):

idx = {1:size(B,1), 1:size(B,2)};
A(idx{:}) = A(idx{:}) + B;

或者,对于任意形状的矩阵,

A(1:size(B,1),1:size(B,2),2) = B;
sum(A,3)

但我建议您对所有这些都非常小心,并且最多谨慎使用它。它本身不可能的事实实际上是对创建错误的保护。矩阵的维数具有数学意义;试图通过标准操作之一自动调整大小会破坏数学规则,这通常是滋生错误的肥沃土壤。

于 2013-07-15T13:44:58.727 回答