【问题标题】:matlab matrices of different sizes (indexing, for loop, and bsxfun)不同大小的 matlab 矩阵(索引、for 循环和 bsxfun)
【发布时间】:2012-06-14 06:35:43
【问题描述】:

我有两个不同大小的矩阵。让我们将矩阵 {a} 定义为 a(1:10) 并将矩阵 {b} 定义为 b(6:10) 。我需要一个 for 循环或等效的 (bsxfun) 来获取矩阵 {a} 和 {b} 之间的差异,代码将根据矩阵 {b} 的大小进行迭代。例如,矩阵 {a} 的第一个值为 1,代码将获取所有矩阵 {b} 值的差。因此,它将总共运行 5 次。矩阵 {a} 的下一个值为 2,代码将迭代 5 次。代码将迭代直到矩阵 {a} 结束,即值为 10。

如果可以的话,你能不能写一个不带 bsxfun 的 for 循环和一个带 bsxfun 的循环,并解释你是如何索引这些值的。另外,只是为了我的启发,如果有N个矩阵(N>2),而不是两个矩阵,代码将如何变化?

谢谢。

【问题讨论】:

  • 您希望ab 成为行向量,例如a = 1:10b = 6:10,还是列向量,例如a = [ 1:10 ]'b = [ 1:10 ]'?其他问题是length(5:10)6,而不是您的问题中的5

标签: matlab loops matrix bsxfun


【解决方案1】:

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

% 定义一些示例数据。

编辑: ab 是列向量,而不是行向量。

a = [ 1:10 ]';

b = [ 6:10 ]'; % 5:10 的垂直大小为 6,而不是 5,因此使用6:10 匹配问题。

首先,非常基本的循环解决方案:遍历所有aIndex,bIndex 对,减去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 解决方案。使用repmat 水平复制a,使其水平大小匹配size(b,1)b 的水平大小)。然后使用repmat 垂直复制转置的b,使其垂直大小匹配size(a,1)a 的原始水平大小)。从复制的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

【讨论】:

  • bsxfun 的解决方案是:DifferenceMatrix=bsxfun(@minus,a,b')
  • @jonas 感谢您指出 bsxfun。 bsxfun 看起来比 repmat 更有效率。
  • @BernardUntalanJr.:它也快了很多。另外,如果 nrz 的回答有帮助,请考虑采纳。
【解决方案2】:

这是你想要做的吗?

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

【讨论】:

  • 使用您编写的代码,如果不是两个矩阵,而是三个矩阵,会发生什么变化。第三个矩阵 (e) 为 (1:15),乘以矩阵 (d) 得到矩阵 (e) 的长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多