【问题标题】:Should arrays be thought of as horizontal or vertical structures数组应该被认为是水平结构还是垂直结构
【发布时间】:2013-01-09 00:57:25
【问题描述】:

我正在做一些 Matlab 作业,但在概念化它处理矩阵的方式时遇到了问题。在 Matlab 中,矩阵是d(row,col) 格式的地址。

我已经编程了一段时间,并且一直倾向于将一维数组视为水平结构,第二维从下方延伸。

从计算机的角度来看,哪种是考虑数组数据结构的“更正确”的方式

【问题讨论】:

    标签: arrays matlab multidimensional-array


    【解决方案1】:

    好问题 +1。

    纯粹从 Matlab 编程的角度来看,最好将矩阵视为一系列列向量。为什么?因为这是 Matlab 将它们分配到计算机内存的方式。也就是说,矩阵的任何给定列中的两个连续元素将在内存中彼此相邻分配。这有时被称为“列优先顺序”,用于 Fortran、R 和 Julia 等语言。相反,不出所料,称为“行主顺序”,用于 C 和 Python。

    这意味着 Matlab 在对矩阵的列执行操作时比对行执行操作要快得多。 @angainor 几个月前为我的一个问题提供了一个great answer,这证明了这一事实。根据@angainor 的见解,这是一个有用的速度测试:

    M = 1000; %# Number of iterations over each method
    T = 1000; %# Number of rows
    N = 1000; %# Number of columns
    
    X = randn(T, N); %# Random matrix
    
    %# Loop over the rows of a matrix and perform a sum operation on each row vector
    tic
    for m = 1:M
        for t = 1:T
            sum(X(t, :));
        end
    end
    toc
    
    %# Loop over the columns of a matrix and perform a sum operation on each column vector
    tic
    for m = 1:M
        for n = 1:N
            sum(X(:, n));
        end
    end
    toc
    

    在我的机器上,测试的结果是:

    Elapsed time is 9.371870 seconds. %# Looping over rows
    Elapsed time is 1.943970 seconds. %# Looping over columns
    

    换句话说,对列执行的操作几乎是对行执行的操作的 5 倍!

    从数学的角度来看,我不相信自己会给出一个好的答案。您可能会从 math.stackexchange 获得一些很棒的见解。

    【讨论】:

    • 在数学上,惯例也是使用列向量。这意味着内积写为 wT X(其中 T 是转置,w 是列向量,X 是矩阵)。你可以用另一种方式来做,但是你必须在你看到它的任何地方颠倒这个顺序,这种方式对大多数复合表达式更有用。
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2013-08-02
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多