Почему, если MATLAB является основным столбцом, некоторые функции выводят строки-векторы?

MATLAB хорошо известен как column-major, что, грубо говоря, означает, что манипулирование элементами массива, находящимися в тот же столбец быстрее, чем манипулировать записями в той же строке.

В этом случае почему так много встроенных функций, таких как linspace и logspace, выводятся векторы строк, а не столбцы? Мне это кажется деоптимизацией...

Что, если таковые имеются, является обоснованием этого дизайнерского решения?

Ответ 1

Это хороший вопрос. Вот некоторые идеи...

Моя первая мысль заключалась в том, что с точки зрения производительности и непрерывной памяти это не имеет значения, если это строка или столбец - они одновременно смежны в памяти. Для многомерного ( > 1D) массива достаточно правильно проиндексировать весь столбец массива (например, v(:,2)), а не строку (например, v(2,:)) или другое измерение, потому что в строке (не -колона), он не обращается к элементам, которые смежны в памяти. Однако для вектора строк, который является 1-by-N, элементы смежны, потому что есть только одна строка, поэтому это не имеет значения.

Во-вторых, проще всего отображать векторы строк в окне команд, тем более, что он обертывает строки длинных массивов. С длинным вектором столбца вы будете вынуждены прокручивать гораздо более короткие массивы.

Больше мыслей...

Возможно, выходной вектор строки из linspace и logspace просто согласуется с тем фактом, что colon (по существу инструмент для создания линейно разнесенных элементов) создает строку:

>> 0:2:16
ans =
     0     2     4     6     8    10    12    14    16

Выбор был сделан в начале времени, и это было (возможно?).

Кроме того, соглашение для переменных цикла может быть важным. Строка необходима для определения нескольких итераций:

>> for k=1:5, k, end
k =
     1
k =
     2
k =
     3
k =
     4
k =
     5

В столбце будет одиночная итерация с переменной нескалярного цикла:

>> for k=(1:5)', k, end
k =
     1
     2
     3
     4
     5

И, возможно, выходы linspace и logspace обычно зацикливаются. Может быть?:)

Но зачем вообще перебирать вектор строки? Ну, как я уже говорил в своих комментариях, это не то, что вектор строк используется для циклов, и он проходит через столбцы выражения цикла. Значение, с for v=M, где M является матрицей 2 на 3, существует 3 итерации, где v - 2-элементный вектор-столбец на каждой итерации. На самом деле это хороший дизайн, если вы считаете, что это связано с разрезанием выражения цикла в столбцы (т.е. Куски смежной памяти!).