向量/一维数组的 MATLAB 索引约定

标签 matlab indexing

考虑以下两个向量的预分配:

vecCol = NaN( 3, 1 );
vecRow = NaN( 1, 3 );

现在的目标是为这些向量赋值(例如,如果向量化不可能,则在循环中)。是否有关于索引的约定或最佳实践?

是否推荐以下方法?

for k = 1:3
    vecCol( k, 1 ) = 1; % Row, Column
    vecRow( 1, k ) = 2; % Row, Column
end

还是写成下面这样更好?

for k = 1:3
    vecCol(k) = 1; % Element
    vecRow(k) = 2; % Element
end

最佳答案

它在功能上没有区别。如果 context 表示向量始终是一维的(本例中的命名约定有帮助),那么您可以使用 vecCol(i) 来实现简洁和灵活。但是,使用 vecCol(i,1) 语法有一些优势:

  • 您使用的载体类型一目了然。如果重要的话,这很好,例如在使用线性代数时,但如果方向是任意的,则可能无关紧要。
  • 如果您忘记初始化(不好但它发生了)那么它将确保方向符合预期
  • 养成一个好习惯,这样你在使用二维数组时就不会忘记
  • 它似乎稍微快一些。这在小型数组上可以忽略不计,但请参阅下面的基准测试,用于包含 10^8 元素的向量,并且速度提高了 >10%。

    function benchie()
    % Benchmark. Set up large row/column vectors, time value assignment using timeit.
        n = 1e8;
        vecCol = NaN(n, 1); vecRow = NaN(1, n);
        f = @()fullidx(vecCol, vecRow, n);
        s = @()singleidx(vecCol, vecRow, n);
        timeit(f)
        timeit(s)
    end
    function fullidx(vecCol, vecRow, n)
    % 2D indexing, copied from the example in question
        for k = 1:n
            vecCol(k, 1) = 1; % Row, Column
            vecRow(1, k) = 2; % Row, Column
        end
    end
    function singleidx(vecCol, vecRow, n)
    % Element indexing, copied from the example in question
        for k = 1:n
            vecCol(k) = 1; % Element
            vecRow(k) = 2; % Element
        end
    end
    

    输出(在 Windows 64 位 R2015b 上测试,您的里程可能会有所不同!)

    % f (full indexing):    2.4874 secs
    % s (element indexing): 2.8456 secs
    

    通过增加 n 迭代此基准,我们可以生成以下图表以供引用。

    enter image description here

关于向量/一维数组的 MATLAB 索引约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45561220/

相关文章:

matlab - 如何使用另一个元素填充矩阵?

matlab - 如何通过 MATLAB 生成由不同频率滑音段组成的声音?

mysql - Mysql的列索引可以单独保存吗?

matlab - Exp 的自定义算法。 Matlab 中的最大化

image - 将矩阵保存为图像

matlab - MATLAB 中的曲线拟合,对于超过 8 项的正弦函数?

mysql - 为什么我不能在我已经为其建立索引的 MySQL 查询中摆脱文件排序

apache - 更改Apache索引的字符集响应 header

sql - 依靠条件连接大表的速度很慢

sql - 每行查询最后 N 个相关行