不同大小的matlab矩阵(索引,for循环和bsxfun)

时间:2012-06-14 06:35:44

标签: matlab loops matrix bsxfun

我有两个不同大小的矩阵。让我们将矩阵{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),代码会如何变化?

谢谢。

2 个答案:

答案 0 :(得分:2)

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

%定义一些示例数据。

修改: ab是列向量,而不是行向量。

a = [ 1:10 ]';

b = [ 6:10 ]';5:10的垂直尺寸为6,而不是5,因此要匹配问题6:10

首先,非常基本的循环解决方案:遍历所有aIndexbIndex对,减去aIndexbIndex所解决的元素的差异,并将结果存储在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'矩阵做什么。