【问题标题】:for looping with an incremented counter in matlab在matlab中使用递增计数器循环
【发布时间】:2015-03-24 20:22:49
【问题描述】:

我有一个 15*15 的二进制矩阵,我将每一行乘以其转置来从外部乘积中得到另一个矩阵,然后将这些矩阵相或得到一个最终矩阵。我正在尝试使用 for 循环来执行此操作,因为我有 15 行,并且我可能会增加它以拥有大量行,因此手动执行此操作是没有意义的。对于转置乘法的行,我关注rayryeng answer。然而,我想应用于整个矩阵。所以,我正在使用以下代码。

VectMat=randi([0 1],15,15);
resultt=zeros(15,15)
for i= 1:15
    row{i}=VecMat(1,:);
    result{i} = bsxfun(@times, row{i}.', row{i});
    resultt=result|resultt
end

我收到一个错误,我知道使用 '{ }' 不正确,但如果我尝试使用 '[ ]',matlab 会将 'resultt' 视为一个数组,并会继续以这种方式添加它.我的伪代码是,在第一次迭代中,“i”将是一个,所有包含“{i}”的变量都将是变量号 1,然后在下一次迭代中,“i”将是 2,依此类推。那么,我可以在matlab上做到这一点吗?

【问题讨论】:

  • 这是一篇您应该考虑阅读的帖子:stackoverflow.com/questions/25877835/… - 这与 Divakar 在下面回答您时使用的方法基本相同。每个外部产品作为切片放置在 3D 矩阵中,所有结果都使用 any 合并在一起,这模拟了所有切片的逻辑 OR。

标签: matlab matrix


【解决方案1】:

您可以使用permute 创建bsxfun 所需的singleton dimensions 以让singleton-expansion 完成其工作,这将基本上取代您的循环。这是实现 -

any(bsxfun(@and,permute(VectMat,[3 2 1]),permute(VectMat,[2 3 1])),3)

请注意,可以使用bsxfun@times 代替bsxfun(@and,但根据我使用bsxfun 的经验,使用逻辑运算符(在本例中为@and)可能更有效。

【讨论】:

  • 这肯定让我想起了this post :)
  • @rayryeng 是的,实际上非常相似!
  • 是的。它还需要一步......使用any,但大部分是那个帖子。
  • @rayryeng 并且排列维度不同,因为这里的 OP 想要行而不是上一篇文章中的列。
  • 哇,我忘记投票了!刚做了。还有,我明白。我意识到根据 OP,我希望它在列而不是行上,所以排列肯定会有所不同。
【解决方案2】:

让线性代数为您完成工作:

VectMat = double(VectMat);
out = (VectMat.'*VectMat)~=0

这将比使用循环或bsxfun 更快。请注意,MATLAB 中没有为逻辑定义矩阵乘法,因此您可能需要先转换为 double,具体取决于您创建“二进制”矩阵的方式。 (在您提供的示例中,VectMat 已经是双精度。)

【讨论】:

  • 聪明的方法!由于输入数组是二进制的,我认为需要转换为double()
  • @Divakar:确实如此。 OP的随机输入矩阵是双精度的,所以我没想到!
【解决方案3】:

使用 any(bsxfun...) 实现的答案要优雅得多(我从中学到了一些新东西)。但是,关于您的实施,这就是您如何使其工作的方式。使用

for i = 1:15
  row(i, :) = VecMat(i, :);
  result = bsxfun(@times, row(i, :).', row(i, :));
  resultt = result|resultt;
end

您也可以简单地将row(i, :) 替换为row

【讨论】:

  • 如果你这样做,你将创建一个低效的副本rowVectMatrow(i, :) = ... 这行有问题。对于 for 循环的每次迭代,都必须分配一个更大的矩阵,并且必须重新排列 row 的值,因为 MATLAB 使用的存储原则是列优先的。更好的方法是用row 替换代码中每次出现的row(i,:),或者甚至更好地用VectMat(i,:) 替换row(i,:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多