Можно ли определить встроенное одномерное изображение? - PullRequest
1 голос
/ 01 марта 2020

Я хотел бы описать очень простое изображение (на самом деле вектор) длиной 2, например (1,2), для целей некоторой линейной алгебры. Следующее создает двухмерное изображение с осью y длины 1:

image a := [2,1]: {
    {1, 2}
}
MatrixPrint(a)

Это выводит

{
{1, 2}
}

Как бы я выглядел аналогичным образом вместо этого?

{123,45}

Кроме того, если у меня было изображение произвольной формы (a, b), как я могу нарезать его, чтобы извлечь одномерное изображение со значением n по осям x или y? (Извлечение профиля линии вдоль одной из осей изображения)

1 Ответ

1 голос
/ 02 марта 2020

В вашем примере вы делаете определяете 2D-изображение, так что вы получаете 2D-вывод. Если изображение действительно будет 1D, вы получите 1D, т.е.

image a := [2]: {123, 45}
MatrixPrint(a)

Таким образом, ваш второй вопрос на самом деле является ответом на ваш первый: вам нужно сделать одномерный фрагмент данных, который вы можете выполните команду slice1() следующим образом:

image a := [2,1]: {
    {123, 45}
}
MatrixPrint( a.slice1(0,0,0,0,2,1) )

Обратите внимание на некоторые особенности команды:

  • Команда всегда предполагает ввод 3D; поэтому первые 3 параметра являются триплетом начального индекса x / y / z, даже если это просто данные 2D или 1D.
  • 2-й триплет определяет выборку среза. Сначала указывается размерный индекс (0 = x), затем количество шагов выборки (2) и затем размер шага (1)

Подобные команды срезов существуют для 2D-срезов, 3D-срезов и nD-срезов из данных nD .


Команда matrixPrint выводится только в окно результатов. Нет способа перенаправить это на какую-то строку. Однако вы можете легко создать себе метод, который бы это делал (хотя и не очень быстро для больших данных):

string VectorPrint( image img, string FormatStr, number maxNum )
{
    if ( !img.ImageIsValid() ) return "{invalid}"
    if ( 1 != img.ImageGetNumDimensions() ) return "{not 1D}"

    string out = "{ "
    number nx = img.ImageGetDimensionSize(0)

    if (( nx <= maxNum ) || ( maxNum <= 2) )
    {
        for( number i=0; i<min(nx,maxNum); i++)
            out += Format( sum(img[0,i]), FormatStr ) + ", "

        out = out.left( out.len() - 2 )
    }
    else 
    {
        for( number i=0; i<maxNum-1; i++)
            out += Format( sum(img[0,i]), FormatStr ) + ", "

        out = out.left( out.len() - 2 ) + ", ... , "
        out += Format( sum(img[0,nx-1]), FormatStr )
    }

    out += " }"
    return out

}

image a := [10,4]: {
    {1,2,3,4,5,6,7,8,9,10},
    {123, 45, 12.3, -12, 55, 1.2, 9999, 89.100, 1e-10, 0},
    {0,0,0,0,0,0,0,0,0,0},
    {1,2,3,4,5,6,7,8,9,10}
}

// Slice 2D image to 1D image at n'th line
number n = 1
image line := a.slice1(0,n,0,0,a.ImageGetDimensionSize(0),1)

// Printout with given number format and a maximum number of entries
string fStr = "%3.1f"
number maxN = 3
Result( "\n "+VectorPrint( line, fStr, maxN ) )
...