我在添加两个不同大小的数组时遇到了问题。当我在这个网站上进行一些探索时,似乎大多数问题涉及具有不同大小的向量,而不是行和列中具有多个维度的实际矩阵。
我知道添加不同尺寸的矩阵在数学上“没有意义”。它只是我用来使代码工作更轻松的工具,但问题就在这里:
A = magic(4);
B = magic(3);
C = A + B
这基本上就是我想要做的。我只想让B在第4行和第4列有零,然后我可以有相同的尺寸并添加它们。但是我该怎么办呢?在此先感谢=)
编辑:另外,特别是我想以某种方式将B添加到A中,因此A中的原始3x3基本上“移过”1列但保持在同一行。
答案 0 :(得分:3)
在添加A和B之前用零填充数组B. 使用“padarray”功能
答案 1 :(得分:3)
请注意,padarray
需要安装图像处理工具箱。
涉及填充的本机解决方案如下所示:
C = B;
C(end + 1:size(A, 1), end + 1:size(A, 1)) = 0;
C = C + A;
这假定矩阵A
的维度大于B
,但如果没有,则可以轻松修改此代码。
填充的替代方法是将矩阵B
添加到A
中的相应元素。这可以通过很多方式实现,例如:
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
中B
和C
元素的索引,并对重叠元素求和。
答案 2 :(得分:1)
假设A
可以被破坏性地重复使用,您也可以通过直接索引到A
来完成它。这样可以保存依赖关系(padarray
)并将内存复杂度降低到O(N)
(而不是O(N²)
或padarray
或手动填充:
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)
但我建议你非常小心这一切,并且最多使用谨慎。事实上它本身不可能实际上是一个保护来防止创建错误。矩阵的维数具有数学意义;试图通过其中一个标准操作自动调整大小打破数学规则,这通常是对于错误的肥沃布局。