【问题标题】:matlab: any command for substitute of for & ifmatlab:任何代替 for & if 的命令
【发布时间】:2014-03-20 02:08:06
【问题描述】:

我有一个关于使用 for 和 if 循环的问题

如果我有这样的情况

我在矩阵 a by b 中有 data_result R,其中 a 是问题的索引,b 是答案

and in 取决于数据 M(x by y) 其中 x = a

我有类似的代码

for i = 1:a
    if M(i) > constant 1
      R(i) = a;
    else if M(i) > constant 2
      R(i) = b;
    else
      R(i) = c;
    end
end

我只是想知道是否有任何可能的解决方案来解决这个最小化 for 循环和 if else 条件

【问题讨论】:

  • 当你说“a*b”时,你的意思是R是a行乘以b列的大小,还是说它是矩阵乘以两个矩阵ab?还是别的什么?
  • 是的,这意味着矩阵 R 有 a 行乘 b 列大小
  • 好的。这通常写成“a x b”或“a-by-b”,以避免与乘法的“a*b”语法混淆。
  • R 和 M 大小一样吗?您是尝试根据对 R 的相应元素的测试来设置 M 的每个元素,还是对整行进行一些操作?

标签: matlab if-statement for-loop


【解决方案1】:

您可以使用> 或对整个数组进行其他元素比较,对选定元素进行“矢量化”更新,然后使用索引进行分配。测试返回布尔数组,您可以使用它来索引输入数组或其他具有相应维度的数组。

R = repmat(c, size(M));
% Do tests in order of increasing selectivity
R(M > 1) = a;
R(M > 2) = b;

【讨论】:

  • 如果您对分布有一些先验知识,则可以通过使两个向量化查找在最小子集上进行操作来使其更快。例如,如果您认为 M 是 80% b、12%c 和 8% a,那么您可以使 R=b*ones(size(M)); R(M==1)=a; R(M>2)=c;你可以获得更快的运行速度。我认为 repmat 可能比 'R=c.*ones(size(M));' 慢。一个很快,点乘也很快。
  • repmat 也是如此,== 和 > 和
  • 提问者是关于大数据的。即使有数百万个元素,我也会使用 for 循环。计算机速度很快,而 for 循环的编写速度也很快。 cln=100; M=个(1000,1000); tic for i=1:N R=repmat(9,size(M));清除 R 结束主题 for i=1:N R=9.*ones(size(M)); clear R end toc 经过的时间是 1.274471 秒。经过的时间是 0.608783 秒。 >> Repmat 是做同样事情的一半速度,两倍的时间。
  • @EngrStudent:提问者没有说明他们的数据大小。并且性能会因操作系统、版本、硬件、数据大小等而有很大差异。我不会从这样的简单测试中进行概括。这是我运行相同的示例代码 (N=100; M=ones(1000,1000); tic; for i=1:N; R=repmat(9,size(M)); clear R; end; toc; tic; for i=1:N; R=9.*ones(size(M)); clear R; end; toc)。时间为 0.156673 秒。经过的时间是 0.543528 秒。在这里,repmat 快了 3 倍。它因人而异。
  • @EngrStudent:计算机速度很快,for-loops 写起来也很快,但是 在 Matlab 中,这就是 asker 所问的,for-loops 有时很慢,因为M 代码操作(如函数调用)的每次操作开销相对较高。所以惯用的 Matlab 代码使用矢量化操作。它们执行得更快,一旦你理解了习语,它们可以更快地编写。请注意,我的示例代码比原始提问者的代码要短得多、简单得多。
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 2017-07-08
  • 2012-04-15
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多