矢量/ 1D阵列的MATLAB索引约定

时间:2017-08-08 06:52:06

标签: 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

2 个答案:

答案 0 :(得分:6)

在功能上没有区别。如果上下文意味着向量总是1D(在此示例中您的命名约定有帮助),那么您可以使用vecCol(i)来简化和灵活。但是,使用vecCol(i,1)语法有一些优点:

  • 明确说明您正在使用哪种类型的矢量。如果重要的话,这很好,例如当使用线性代数时,如果方向是任意的,则可能无关紧要。
  • 如果您忘记初始化(不好但发生了),那么它将确保方向符合预期
  • 这是一个很好的习惯,因此你在使用2D数组时不会忘记
  • 似乎稍快一些。这在小阵列上可以忽略不计,但是对于具有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

答案 1 :(得分:4)

编程中的一般经验法则是#34;显式优于隐式"。由于两者之间没有功能差异,我说它取决于哪个更干净/更好的背景:

  • 如果上下文使用了大量矩阵代数并且行和列向量之间的区别很重要,请使用2参数索引来减少错误并促进阅读

  • 如果上下文在两者之间没有太大的区别,并且您只是使用向量作为简单数组,则使用单参数索引更清晰

相关问题