2012-06-14 82 views
0

我有两个不同大小的矩阵。让我们将矩阵{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不同大小的matlab矩阵(索引,循环和bsxfun)

如果你能写,你都一个for循环不bsxfun和一个与解释你如何索引值。另外,仅仅为了我的启发,而不是两个矩阵,如果存在N个矩阵(N> 2),代码将如何改变?

谢谢。

+0

你想'A'和'B'为行向量,比方说一个'= 1:10'和'B = 6:10',或列向量,比方说一个'= [1:10]“'和'b = [1:10]''?其他问题是“长度(5:10)”是你的问题中的“6”,而不是“5”。 – nrz

+0

这是一个错字。谢谢 – Buntalan

回答

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水平尺寸)。然后垂直通过使用repmat使得其垂直尺寸相匹配size(a,1)(的a原始水平尺寸)重复实验换位b。从复制的b中减去复制的a,并将结果存储在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 
+3

'bsxfun'解决方案是:'DifferenceMatrix = bsxfun(@ minus,a,b')' – Jonas

+0

@nrz感谢这正是我一直在寻找的。 – Buntalan

+0

@jonas感谢您指出bsxfun。 bsxfun看起来比repmat更有效率。 – Buntalan

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个矩阵做什么。

+0

用你写的代码,如果不是两个矩阵,有三个会改变什么。第三个矩阵(e)是(1:15),矩阵(e)的长度乘以矩阵(d)。 – Buntalan