Конечно, по строкам. В Паскале многомерные массивы построчно хранятся, точно так же, как в Фортране исторически многомерные массивы хранятся по столбцам. У Вас же не возникает вопроса, по строкам или по столбцам работает ReadMatrInteger? Если понадобится по столбцам - вот тогда используется a.ElementsByCol, В то же время, a.ElementsByRow можно оставить в качестве синтаксического сахара. И a.ElementsWithIndexes остается (кстати, Вы не же задаете вопрос, по строкам это делается или по колонкам). Не могу согласится с “мухами и котлетами”: если уж это Reshape(), то изменение формы массива должно быть именно универсальным. И если графически элементы двумерного массива выглядят, как прямоугольник, то этот прямоугольник можно произвольно деформировать при условии, что он остается прямоугольником, в котором количество образующих его элементов не увеличивается. В том числе, этот прямоугольник можно вытягивать до горизонтальной линии (строки) или вертикальной (колонки). Но и в NumPy, и в Fortran можно с помощью Reshape менять также и ранг (количество измерений) массива - это тоже входит в понятие изменения формы. В конце-концов, в обоих этих языках Reshape универсальный метод (функция), который работает с массивами произвольной размерности и нет проблемы из a[6,8] получить b[2,6,4], с[48] или d[12,4]. Почему в Паскале это должно быть кастрировано?
Тут я Вас понимаю. Но поймите и Вы: я вовсе не предлагаю создавать двумерный массив из куска одномерного: если это понадобится, всегда можно воспользоваться соответствующим срезом при условии, что Reshape умеет создавать матрицу из всех элементов одномерного массива или последовательности. Но срезов для двумерных массивов у нас нет и не знаю, будут ли.
Пусть дан массив a[n,n+1], (к примеру, это расширенная матрица для системы n линейных уравнений и требуется взять n первых столбцов, чтобы получить и затем обратить матрицу системы). Сейчас это делается примерно так:
var tmp:=a.ElementsByCol.ToArray[:n*n];
var b:=new integer[n,n];
for var i:=0 to n-1 do
for var j:=0 to n-1 do
b[j,i]:=tmp[i*n+j];
А чем плохо было бы это сделать вот так: var b:=a.Transpose.Reshape(n,n).Transpose; ? Я скажу чем: странным двукратным транспонированием. А появляется оно потому, что не случайно и NumPy, и Fortran умеют делать Reshape и построчно, и поколонно. Да-да, как раз третьим опциональным параметром, меняющим порядок рассмотрения измерений массива по умолчанию. Который, насколько я понимаю, Вы назвали “не надо тупить в конец”. И да, нужно еще научить Transpose быть расширением, возвращающим матрицу.
Хотя, у нас есть функция Length(массив, номер измерения), как раз для n-мерного массива возвращает количество элементов по нужному измерению, а для одномерных по этот второй параметр может опускаться. И что мешает также опционально написать var b:=a.Reshape(n,n,1) и разом решить проблему?