我有两个不同大小的矩阵。让我们将矩阵{a}定义为(1:10)< 10 x 1>和矩阵{b}为b(6:10)< 5 x 1>。我需要一个for循环或等价(bsxfun)来获得矩阵{a}和{b}之间的差异,代码将根据矩阵{b}的大小进行迭代。例如,矩阵{a}的第一个值是1,代码将获得所有矩阵{b}值的差异。因此,它将共运行5次。矩阵{a}的下一个值是2,代码将迭代5次。代码将迭代直到矩阵{a}的末尾,即值10。
如果你可以在没有bsxfun的情况下编写for循环,并且可以编写一个for循环,并解释如何索引值。另外,仅仅为了我的启发而不是两个矩阵,如果有N个矩阵(N> 2),代码会如何变化?
谢谢。
答案 0 :(得分:2)
这是一个循环解决方案和一个repmat
解决方案。
%定义一些示例数据。
修改: a
和b
是列向量,而不是行向量。
a = [ 1:10 ]';
b = [ 6:10 ]';
%5:10
的垂直尺寸为6,而不是5,因此要匹配问题6:10
。
首先,非常基本的循环解决方案:遍历所有aIndex
,bIndex
对,减去aIndex
和bIndex
所解决的元素的差异,并将结果存储在LoopDifferenceMatrix(aIndex, bIndex)
。
for aIndex = 1:size(a,1)
for bIndex = 1:size(b,1)
LoopDifferenceMatrix(aIndex, bIndex) = a(aIndex) - b(bIndex);
end
end
这是另一种repmat
解决方案。使用a
水平复制repmat
,使其水平尺寸与size(b,1)
匹配(b
的水平尺寸)。然后使用b
垂直复制转置repmat
,使其垂直大小与size(a,1)
(原始水平大小a
)匹配。从已复制的a
中减去复制的b
,并将结果存储在DifferenceMatrix
中。
DifferenceMatrix = repmat(a, 1, size(b,1)) - repmat(b', size(a,1), 1);
DifferenceMatrix =
-5 -6 -7 -8 -9
-4 -5 -6 -7 -8
-3 -4 -5 -6 -7
-2 -3 -4 -5 -6
-1 -2 -3 -4 -5
0 -1 -2 -3 -4
1 0 -1 -2 -3
2 1 0 -1 -2
3 2 1 0 -1
4 3 2 1 0
isequal(DifferenceMatrix, LoopDifferenceMatrix)
ans =
1
答案 1 :(得分:1)
这是你想要做的吗?
a = 1:10;
b = 6:10;
c = zeros(length(b),length(a));
d = zeros(length(b),length(a));
for n = 1:length(b)
c(n,:) = bsxfun(@minus,a,b(n));
d(n,:) = a - b(n);
end
至于如何使用N个矩阵,你必须指定你想用N'矩阵做什么。