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

Dis*_*ake 3 indexing matlab

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

vecCol = NaN( 3, 1 );
vecRow = NaN( 1, 3 );
Run Code Online (Sandbox Code Playgroud)

现在的目标是为这些向量分配值(例如,如果无法进行矢量化,则在循环内).是否有关于索引的约定或最佳实践?

是否建议采用以下方法?

for k = 1:3
    vecCol( k, 1 ) = 1; % Row, Column
    vecRow( 1, k ) = 2; % Row, Column
end
Run Code Online (Sandbox Code Playgroud)

或者编码如下更好?

for k = 1:3
    vecCol(k) = 1; % Element
    vecRow(k) = 2; % Element
end
Run Code Online (Sandbox Code Playgroud)

Wol*_*fie 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
    
    Run Code Online (Sandbox Code Playgroud)

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

    % f (full indexing):    2.4874 secs
    % s (element indexing): 2.8456 secs
    
    Run Code Online (Sandbox Code Playgroud)

    迭代此基准而不是增加n,我们可以生成以下图表以供参考.

    在此输入图像描述