【问题标题】:Iterate over each row in matrix Octave遍历矩阵 Octave 中的每一行
【发布时间】:2019-12-21 02:49:58
【问题描述】:

如何遍历 Z 中的每一行,其中 Z 是一个 2 * m 矩阵:

6.1101,17.592
5.5277,9.1302
8.5186,13.662

如何访问此循环中的每个 Z(i)(j)

例如:

for i = z
  fprintf('Iterating over row: '+ i);
  disp (i:1);
  disp (i:2);
end

会输出:

Iterating over row: 1
6.1101
17.592
Iterating over row: 2
5.5277
9.1302
Iterating over row: 3
8.5186
13.662

【问题讨论】:

    标签: octave


    【解决方案1】:

    如果在 z 为矩阵时使用for i = z,则 i 取 z 的第一列的值(6.1101;5.5277;8.5186),然后是第二列,以此类推。见octave manual: The-for-Statement

    如果你想遍历所有可以使用的元素

    z = [6.1101,17.592;5.5277,9.1302;8.5186,13.662]
    
    for i = 1:rows(z)
      for j = 1:columns(z)
        printf("z(%d,%d) = %f\n", i, j, z(i,j));
      endfor
    endfor
    

    哪个输出:

    z(1,1) = 6.110100
    z(1,2) = 17.592000
    z(2,1) = 5.527700
    z(2,2) = 9.130200
    z(3,1) = 8.518600
    z(3,2) = 13.662000
    

    但请记住,for 循环在 octave 中很慢,因此可能需要使用矢量化方法。许多函数可以使用矩阵输入进行最常见的计算。

    例如如果要计算总和:

    octave> sum (z(:))
    ans =  60.541
    

    或相邻行之间的差异:

    octave> diff (z)
    ans =
    
      -0.58240  -8.46180
       2.99090   4.53180
    

    【讨论】:

    • 来自强大的 JavaScript 背景,矢量化方法的想法对我来说似乎很陌生。如果我的目标是计算 X 的所有迭代 m 的总和,其中每个迭代算术都是在 X(i,j) 上执行的如果没有 for 循环,这个例子看起来像?
    • 如果你想计算 z 中所有元素的总和,你可以使用“sum (z(:))”。您还可以使用“sum”(它是一个八度函数)来计算行或列的总和。请参阅“帮助总和”和 DIM 参数。 Octave 设计用于处理矩阵,因此您真的非常不可能需要遍历向量或矩阵。
    • 这个答案非常接近,以至于当它不起作用时我真的很困惑。如您链接的手册中所示, for 不会遍历矩阵的行,而是遍历列。您需要转置以获得预期的效果。
    • @Tim:你说得对,第一句话我倒了列和行
    • 在 Octave 或 Matlab 中使用“i”作为变量名时要非常小心。 "for i = 1:rows(z)" 这会将全局变量 i 从具有值 sqrt(-1) 更改为在这种情况下名为 z 的对象中的行数。因此,如果您在此代码之后进行任何复数操作,例如 a = (2, 3i);会出现奇怪的行为!
    【解决方案2】:

    您可以先转置矩阵,然后像这样执行for 语句:

    for i = z'
        disp(i(1))
        disp(i(2))
    end
    

    虽然在这种情况下你不会有一个索引来说明你正在使用哪一行

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2016-02-12
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多