问题 阵列应该被认为是水平或垂直结构


我正在做一些Matlab的家庭作业,我遇到的问题是概念化它解决矩阵的方式。在Matlab中,矩阵是地址 d(row,col) 格式。

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

从计算机的角度来看,这些是从阵列数据结构中思考的“更正确”的方式


8571
2018-01-25 04:35


起源



答案:


好问题+1。

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

这意味着Matlab在对矩阵的列上执行操作要比在行上执行操作要快得多。 @angainor提供了一个 很好的答案 几个月前我的一个问题证明了这一事实。根据@ 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


15
2018-01-25 04:42



在数学上,惯例也是使用列向量。这意味着内积被写为wT X(其中T是转置,w是列向量,X是矩阵)。你可以用另一种方式做到这一点,但你必须在你看到它的任何地方反转那个顺序,这种方式对大多数复合表达式更有用。 - bright-star


答案:


好问题+1。

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

这意味着Matlab在对矩阵的列上执行操作要比在行上执行操作要快得多。 @angainor提供了一个 很好的答案 几个月前我的一个问题证明了这一事实。根据@ 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


15
2018-01-25 04:42



在数学上,惯例也是使用列向量。这意味着内积被写为wT X(其中T是转置,w是列向量,X是矩阵)。你可以用另一种方式做到这一点,但你必须在你看到它的任何地方反转那个顺序,这种方式对大多数复合表达式更有用。 - bright-star