0

我有两个不同大小的矩阵。让我们将矩阵 {a} 定义为 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 循环和一个带 bsxfun 的循环,并解释您是如何索引这些值的。另外,只是为了我的启发,如果有 N 个矩阵(N>2),而不是两个矩阵,代码将如何变化?

谢谢你。

4

2 回答 2

2

这是一个循环解决方案和一个repmat解决方案。

% 定义一些示例数据。

Edit: a and b are column vectors, not row vectors.

a = [ 1:10 ]';

b = [ 6:10 ]'; % 5:10 has vertical size of 6, not 5, so to match the question 6:10 is used.

First, the very basic loop solution: loop through all aIndex,bIndex pairs, subtract the difference of elements addressed by aIndex and bIndex and store the result in LoopDifferenceMatrix(aIndex, bIndex).

for aIndex = 1:size(a,1)
    for bIndex = 1:size(b,1)
        LoopDifferenceMatrix(aIndex, bIndex) = a(aIndex) - b(bIndex);
    end
end

This is an alternative repmat solution. Replicate a horizontally by using repmat so that its horizontal size matches size(b,1) (the horizontal size of b). Then replicate transposed b vertically by using repmat so that its vertical size matches size(a,1) (the original horizontal size of a). Subtract replicated a from replicated b and store the result in 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
于 2012-06-14T07:30:35.393 回答
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 个矩阵做什么。

于 2012-06-14T07:42:12.117 回答