2017-08-08 101 views
3

MATLAB索引约定考虑以下两个向量的预分配:为载体/ 1D阵列

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 

回答

6

它使在功能上没有区别。如果上下文意味着向量始终是1D(在本例中您的命名约定有帮助),那么您可以使用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

4

编程中的一般规则是“显式优于隐式”。由于两者之间没有功能上的差异,我会说这取决于上下文哪一个是清洁剂/更好:

  • 如果上下文使用了大量的矩阵代数和行和列向量之间的区别重要的是,使用2个参数的索引,以减少错误,并有助于阅读

  • 如果上下文不disciminate两者之间的多,你仅仅使用向量作为简单数组,使用1参数索引是清洁